Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Problem z MYSQL DELETE
Forum PHP.pl > Forum > Przedszkole
honytowk
Witam nie mogę sobie poradzić z funkcją DELETE. Update działa tak jak powinien wszystko ok, a
DELETE FROM nie odpowiada w ogolę, nie usuwa pożądanego rekordu
jak to naprawić?
rekordy w bazie zapisują się w taki sposób: " 10.11.12.13 "
  1. if (isset($update_profile)) {
  2. $result = dbquery("UPDATE ".$db_prefix."users SET grupy='".$userdata['grupy'].".".$grupa."' WHERE user_id='".$userdata['user_id']."'");
  3.  
  4. }
  5. if (isset($delete_profile)) {
  6. $result = dbquery("DELETE FROM ".$db_prefix."users WHERE grupy='.".$grupa."' AND user_id='".$userdata['user_id']."'");
  7. }
  8.  
  9. }
  10.  
  11.  
  12.  
  13. echo "<form name='inputform' method='post' action='' enctype='multipart/form-data'>\n";
  14. echo "<table align='center' cellpadding='0' cellspacing='0'>\n";
  15. if ($userdata['grupy'] != $grupa) {
  16. echo "
  17.  
  18. <center><input type='submit' name='update_profile' value='Zapisz się' class='button'>
  19. </center></form> ";
  20. echo "
  21. <form name='inputform' method='post' action='' enctype='multipart/form-data'>
  22. <center><input type='submit' name='delete_profile' value='usun się' class='button'>
  23. </center> ";
  24. }
  25.  
  26.  
  27.  
  28.  
  29. </td>
  30. </tr>
  31. </table>
  32. </form>\n";
  33.  
  34.  
  35. ";
potreb
Daj po delete echo mysql_error(); i zobacz czy wywala jakiś błąd, jeżeli nie, to błąd może leżeć w konstrukcji zapytania.
honytowk
nie wywala żadnego błędu, wie ktoś jak ułożyć lepszą konstrukcje zapytania?
Zosiek
$result = dbquery("DELETE FROM ".$db_prefix."users WHERE grupy='.".$grupa."' AND user_id='".$userdata['user_id']."'");
A co to?? tongue.gif

@
a tak na marginesie to jak ty chcesz coś usunąć jeśli dodajesz .$userdata['grupy'].".".$grupa. a usuwasz używając tylko $grupa questionmark.gif
honytowk
Cytat(Zosiek @ 5.11.2009, 20:54:12 ) *
$result = dbquery("DELETE FROM ".$db_prefix."users WHERE grupy='.".$grupa."' AND user_id='".$userdata['user_id']."'");
A co to?? tongue.gif

.".$grupa." <-- tak zapisywane są rekordy pisałem już w pierwszym poście ze zapisuja sie w bazie tak " .10.11.12.3.8.5.4 itd... "


Cytat(Zosiek @ 5.11.2009, 20:54:12 ) *
@
a tak na marginesie to jak ty chcesz coś usunąć jeśli dodajesz .$userdata['grupy'].".".$grupa. a usuwasz używając tylko $grupa questionmark.gif

".$userdata['grupy']." to grupy do których użytkownik już należy ".$grupa." to grupa którą chce dodać
(krótko mowiąc zrobione jest to po to żeby poprzednie grupy się nie kasowały)
potreb
Ale i tak kasujesz tylko użytkownika to po co chcesz robić dodatkowy warunek dla grupy?
skowron-line
1. Czy warunek jest spełniony questionmark.gif
2. Zrzuć sobie zapytanie na ekran może złączenie zmiennych nie jest takie jak powinno być
3. Zrzut wklej do pma i zobacz co sie stanie, jeżeli nie ma błędu to obstawiam opcję 2
honytowk
Cytat(potreb @ 5.11.2009, 21:33:33 ) *
Ale i tak kasujesz tylko użytkownika to po co chcesz robić dodatkowy warunek dla grupy?

Nie kasuje użytkownika tylko grupy które zapisują się w tabeli users -> tzn. "user_id, user_name, grupy"
Cytat([b]skowron-line[/b] @ 5.11.2009, 21:33:33 ) *

2. Zrzuć sobie zapytanie na ekran może złączenie zmiennych nie jest takie jak powinno być

a z tym zrzutem chodzi ci o to żebym wyświetlił zmienne?
(zmienne już wyświetlałem działają wszystkie tak jak powinny)
skowron-line
Cytat(honytowk @ 5.11.2009, 22:02:55 ) *
Nie kasuje użytkownika tylko grupy które zapisują się w tabeli users -> tzn. "user_id, user_name, grupy"

a z tym zrzutem chodzi ci o to żebym wyświetlił zmienne?
(zmienne już wyświetlałem działają wszystkie tak jak powinny)

To pokaż to zapytanie.
honytowk
no usuwać grupę chce zapytaniem:
  1. $result = dbquery("DELETE FROM ".$db_prefix."users WHERE grupy='.".$grupa."' AND user_id='".$userdata['user_id']."'");

ale to nie działa dlatego pytam co mam zmodyfikować
potreb
Cytat(honytowk @ 5.11.2009, 22:02:55 ) *
Nie kasuje użytkownika tylko grupy które zapisują się w tabeli users -> tzn. "user_id, user_name, grupy"


Pokaż strukturę tabeli i przykąłd.

Wg mnie chcesz usunąć tylko użytkownika z danej grupy, tzn skasować mu daną grupę, jeżeli tak to do tego nie służy funkcja delete tylko update z poprawnym warunkiem.
honytowk
Cytat(potreb @ 5.11.2009, 22:38:49 ) *
Pokaż strukturę tabeli i przykąłd.

Wg mnie chcesz usunąć tylko użytkownika z danej grupy, tzn skasować mu daną grupę, jeżeli tak to do tego nie służy funkcja delete tylko update z poprawnym warunkiem.



dokładnie o to mi chodzi ale jak odjąć w UPDATE ten rekord '.".grupa."' od ".$userdata['grupy']." questionmark.gif

A oto zrzut:
TABLE `ep_users` (
`user_id` smallint(5) unsigned NOT NULL auto_increment,
`user_name` varchar(30) NOT NULL default '',
`user_password` varchar(32) NOT NULL default '',
`user_email` varchar(100) NOT NULL default '',
`user_hide_email` tinyint(1) unsigned NOT NULL default '1',
`user_location` varchar(50) NOT NULL default '',
`user_birthdate` date NOT NULL default '0000-00-00',
`user_aim` varchar(25) NOT NULL default '',
`user_icq` varchar(15) NOT NULL default '',
`user_msn` varchar(100) NOT NULL default '',
`user_yahoo` varchar(100) NOT NULL default '',
`user_web` varchar(200) NOT NULL default '',
`grupy` text NOT NULL,
`photo_vip` varchar(100) NOT NULL default 't.jpg',
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=22 ;
potreb
  1. $groupuser = dbarray(dbquery("SELECT `grupa` FROM ".$db_prefix."users WHERE user_id='".$userdata['user_id']."'"));
  2. $grupa = str_replace(''.$grupa.'.', '', $groupuser['grupa']);
  3. $result = dbquery("UPDATE ".$db_prefix."users SET grupy='".$grupa."' WHERE user_id='".$userdata['user_id']."'");
thek
Moim zdaniem źle zrobiłeś używając do oznaczeń liczb. W ten sposób zamiast jakoś sensownie działać na samej bazie operując jedynie w prosty sposób na stringu, zmusiłeś się do pobrania całego pola z bazy, explode'owaniu tego do tablicy, zrobieniu unset elementu o określonej wartości, implode'owaniu i dopiero zapisie do bazy tego. Gdybyś sensowniej zapisywał elementy nie było by problemu. Użycie liter dałoby Ci większy zakres (wszystkie litery alfabetu czy nawet znaki i cyfry) a ujęcie z obu stron liczby delimiterami to też jakieś rozwiązanie. A tak masz problem, bo nie możesz użyć szukania w stylu .grupa. gdyż oznaczenie grupy może być na końcu lub początku co zaowocuje brakiem z którejś strony kropki. No chyba, że to jakiś panel administracyjny z checkboxami. Wtedy wszystkie są przepychane jako elementy tablicy i zrobienie explode i implode z góry już jest i tak robione.
Ale to jest zgaduj zgadula, bo nie wiadomo jak w skrypcie Ty te grupy "przetwarzasz".

EDIT: @potrebUP: Sądząc z opisu istnieje przynależność do kilku grup jako możliwość, a to oznacza, że ze stringiem tak nie można postąpić, bo będą jaja gdy ktoś zechce odejść z grupy o numerze jednocyfrowym, gdy są już wielocyfrowe. Zrobiłbyś w sytuacji
.11.5.211.34 z usunięciem grupy 11 taki cyrk w efekcie => .5.234
On musi w takiej sytuacji zrobić explode z użyciem . jako delimitera i zrobić unset konkretnego elementu a potem implode z . znów jako delimiter i do bazy. Usuwanie jednocyfrowych grup userowi zrobiłoby w bazie masakrę.
honytowk
działa, ale jest jeden mankament: jak usunę parę grup i zostanie tylko jedna to jej już się nie da usunąć a gdy jest ich kilka w tabeli to da rade usunąć ale zawsze tej ostatniej już się nie da
potreb
Cytat(thek @ 5.11.2009, 23:11:49 ) *
EDIT: @potrebUP: Sądząc z opisu istnieje przynależność do kilku grup jako możliwość, a to oznacza, że ze stringiem tak nie można postąpić, bo będą jaja gdy ktoś zechce odejść z grupy o numerze jednocyfrowym, gdy są już wielocyfrowe. Zrobiłbyś w sytuacji
.11.5.211.34 z usunięciem grupy 11 taki cyrk w efekcie => .5.234
On musi w takiej sytuacji zrobić explode z użyciem . jako delimitera i zrobić unset konkretnego elementu a potem implode z . znów jako delimiter i do bazy. Usuwanie jednocyfrowych grup userowi zrobiłoby w bazie masakrę.


Masz rację, wtedy zacznie się miszmasz w kolumnie z grupami. Rozbicie na częsci tego byłoby lepsze a raczej pożądane.
thek
Zrób może według takiego wzorca:
  1. $string_grup = 'tu_są_te_grupy_z_kropkami_pomiędzy';
  2. $grupa = 'tu_jest_numer_grupy_do _usunięcia';
  3. $temp = explode('.', $string_grup);
  4. $key = array_search( $grupa, $temp ); //sprawdzenie czy taka grupa istnieje pomiędzy tymi w jakich jest user
  5. if( $key )
  6. unset( $temp[$key] ); //usunięcie grupy
  7. $po_usunięciu = implode('.', $temp); //złożenie do kupy

Zauważ, że jeśli usuniesz w ten sposób ostatni element to otrzymasz w wyniku ciąg pusty. Po explode pierwszy element tablicy jest ciągiem pustym, ale jeśli usuniesz ostatnią grupę to implode jednoelementowej tablicy daje w wyniku string o wartości tego elementu, a więc pusty string tak czy inaczej. Takowy możesz potem przesłać jako wartość w UPDATE bez problemu (de facto wpisanie tam wartości pustej będzie jak wywalenie usera z wszystkich grup). Na upartego mógłbym wywalić IF i od razu po search robić unset ale wolę to sprawdzić dla bezpieczeństwa. Mógłbym też (znów na upartego) zabezpieczyć się przed sytuacją, gdy user jest kilkukrotnie w tej samej grupie wpisany i zamiast array_search użyć array_keys i potem robić unset w pętli foreach po zwróconych mi kluczach. Ale to już nadmierne zabezpieczanie się, choć możliwe, że będzie konieczne jeśli nie pilnujesz czy user jest już przypisany do danej grupy.
honytowk
if (isset($delete_profile)) {
$string_grup = ($userdata['user_id']);
$grupa = ($grupa); // to wywaliłem
$temp = explode('.', $string_grup);
$key = array_search( $grupa, $temp ); //sprawdzenie czy taka grupa istnieje pomiędzy tymi w jakich jest user
if( $key )
unset( $temp[$key] ); //usunięcie grupy
$po_usunięciu = implode('.', $temp); // i zamieniłem te ę na e
}
}

nadal nie działa
thek
Więc popatrz co zawierają wszystkie te zmienne i zobacz gdzie może się sypać. Bo może nie przekazujesz właściwych zmiennych do skryptu. Innymi słowy zdebuguj go smile.gif I w pierwszej kolejności sprawdziłbym co masz w $temp PO explode oraz PO unset oraz czy array_search zwraca Ci cokolwiek. Debuguj zmienne w trakcie działania skryptu i popatrz co Ci zwracają. var_dump niech Ci pomoże smile.gif

EDIT... A najważniejsze jest jedno... Wszystko musisz wewnątrz nawiasów klamrowych od if(isset($delete_profile)) {} <- Inaczej $po_usunieciu zostanie nullem bo jest to dla skryptu wtedy zmienna lokalna, która po wyjściu z owego IF jest niszczona. Poczytaj o zasięgu zmiennych. Aby zadziałało musisz update wykonać od razu pod implode. By sobie to sprawdzić wyświetl $string_grup na starcie i $po_usunieciu. Jeśli różnica będzie właśnie o wywalaną grupę to znaczy, że skrypt działa, tylko Ty gdzieś źle przekazujesz wynik usuwania, czyli zmienną $po_usunieciu
honytowk
okej, wszystko przeanalizowałem, poprawiłem teraz już działa dzięki wielkie wszystkim za poświęcony mi czas;)

mam jeszcze jedno pytanie:

Co mam zrobić żeby wyświetlało mi użytkowników należących do danej grupy?
(w każdym wierszu po 4 wyniki kolumn 3 na 1 stronę)

wynik powinien być taki :

  1. echo "\n<td align='center' valign='top'>\n<a href='".BASEDIR."profile.php?lookup=".$data['user_id']."'><img src='".PHOTOS2."".$data['photo_vip']."'><br>".$data['user_aim']." ".$data['user_icq']."</a></td>\n";
thek
Jeśli chcesz ograniczać wyniki na stronach to poczytaj o paginacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.