Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL][PDO] Przepisanie funkcji z MySQL na PDO
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
Kshyhoo
Mam kolejny problem, w MySQL:
  1. else {
  2. mysql_query("DELETE FROM g_as_ps WHERE p_id=".$p['p']." AND a_id=".$p['id_a']);
  3.  
  4. mysql_query("UPDATE g_p SET a_id=0 WHERE p=".$p['p']);
  5.  
  6. $msg = "załatwione";
  7. }

PDO bez bindowania:
  1. else {
  2. $r = $pdo->exec("DELETE FROM g_as_ps WHERE p_id=".$p['p']." AND a_id=".$p['id_a']);
  3.  
  4. $q = $pdo->exec("UPDATE g_p SET a_id=0 WHERE p=".$p['p']);
  5.  
  6. $msg = "załatwione";
  7. }

Działa, ale w PDO trzeba kliknąć 2x na link, czyli na raz wykonuje się jedno zapytanie. Jak to naprawić?
Turson
albo samo $pdo->exec albo np.
$r = $pdo->exec
if($r)
ZaXaZ
Cytat(Kshyhoo @ 4.04.2014, 16:16:58 ) *
Mam kolejny problem, w MySQL:
  1. else {
  2. mysql_query("DELETE FROM g_as_ps WHERE p_id=".$p['p']." AND a_id=".$p['id_a']);
  3.  
  4. mysql_query("UPDATE g_p SET a_id=0 WHERE p=".$p['p']);
  5.  
  6. $msg = "załatwione";
  7. }

PDO bez bindowania:
  1. else {
  2. $r = $pdo->exec("DELETE FROM g_as_ps WHERE p_id=".$p['p']." AND a_id=".$p['id_a']);
  3.  
  4. $q = $pdo->exec("UPDATE g_p SET a_id=0 WHERE p=".$p['p']);
  5.  
  6. $msg = "załatwione";
  7. }

Działa, ale w PDO trzeba kliknąć 2x na link, czyli na raz wykonuje się jedno zapytanie. Jak to naprawić?


1. przypisałeś do zniennych q i r zapytania, sprawdzasz je chociaż skoro przypisales? - jak nie to nie potrzeba przypisywać.
2. (co do pierwszego): Jeśli nie sprawdzasz to coś mi się zdaje że lepiej query zamiast exec. Exec chyba zwraca ilość wierszy na update i delete itd,

ja mam w transakcji 3 inserty i normalnie działa.

  1. else
  2. {
  3. $pdo->query('DELETE FROM g_as_ps WHERE p_id='.$p['p'].' AND a_id='.$p['id_a']);
  4. $pdo->query('UPDATE g_p SET a_id=0 WHERE p='.$p['p']);
  5. $msg = 'załatwione';
  6. }
Kshyhoo
I tak muszę kliknąć 2x...
Nie mogę nic znaleźć w necie na ten temat. A nie muszę zrobić coś na:
  1. {
  2. $r = $pdo->prepare("DELETE ...
  3. $r->execute();
  4.  
  5. $r = $pdo->prepare("UPDATE...
  6. $r->execute();
  7. }
Turson
  1. $pdo->query('DELETE FROM g_as_ps WHERE p_id='.$p['p'].' AND a_id='.$p['id_a']);
  2. $pdo->query('UPDATE g_p SET a_id=0 WHERE p='.$p['p']);

musi pójśc za pierwszym, a jak nie to szukaj przyczyny gdzieś indziej. Ewentualnie prepare, execute i errorInnfo()

nie query a exec
Kshyhoo
No przecież tak mam i nie działa. Muszę kliknąć 2x w link.

Heh, tą moją metodą też muszę 2x w link klepać.

Mam taki link:
  1. <a href="?go=association&amp;leave=ok">opuść</a>

potem:
  1. } elseif(!empty($_GET['leave'])) {
  2. require_once('function/association_leave.php');
  3. $msg = association_leave($User);

a funkcja:
  1. else {
  2. // odejdź
  3. $d = $pdo->prepare("DELETE FROM g_associations_players
  4. WHERE player_id=".$player['player']."
  5. AND association_id=".$player['id_association']);
  6. $d->execute();
  7.  
  8. $u=$pdo->prepare("UPDATE g_players
  9. SET id_association=0
  10. WHERE player=".$player['player']);
  11. $u->execute();
  12.  
  13. $msg = "done";
  14. }
Turson
  1. $msg = association_leave($User)

a gdzie ją wywołujesz?
Kshyhoo
Ten komunikat? Zaraz pod tym:
  1. } elseif(!empty($_GET['leave'])) {
  2. require_once('function/association_leave.php');
  3. $msg = association_leave($User);
  4. echo $msg."<hr/>";
  5. }

A link jest poniżej klamerek. W czystym MySQL działa normalnie, więc to wina PDO.
ZaXaZ
zamien te cudzyslowia na apostrofy w zapytaniach - bo będzie szybciej chodziło, a przecież niemasz tam zmiennych ani nic to po co sobie skrypt nieco spowalniać?,
query warto używać jeśli chcesz zobaczyć błędy bo exec chyba tylko nie wykona ;-), + skasuj te przypisania zmiennych, bo tak jak pisałem sprawdzasz je gdzieś np ifem? (w tym przed przeróbką na PDO nie miałeś) więc chyba nie sprawdzasz, a jak nie działa (już nie działało ponoć) to chociaż masz pewność że jak tam naprawisz to jesteś bliżej do zmiany na PDO ;p
Kshyhoo
Pisałem, że działało. Muszę kliknąć 2x po zmianie na PDO. Oczywiście, że wcześniej dane są sprawdzane. Zmienne zostały dodane do sprawdzenia.
ZaXaZ
Cytat(Kshyhoo @ 4.04.2014, 17:36:24 ) *
Pisałem, że działało. Muszę kliknąć 2x po zmianie na PDO. Oczywiście, że wcześniej dane są sprawdzane. Zmienne zostały dodane do sprawdzenia.


ok ok, to chyba to źle zrozumiałem...
Cytat
No przecież tak mam i nie działa. Muszę kliknąć 2x w link.

Heh, tą moją metodą też muszę 2x w link klepać.
Kshyhoo
Moją metodą, czyli:
  1. {
  2. $r = $pdo->prepare("DELETE ... );
  3. $r->execute();
  4.  
  5. $r = $pdo->prepare("UPDATE... );
  6. $r->execute();
  7. }
Turson
Spróbuj tą metodą http://forum.php.pl/index.php?s=&showt...t&p=1098039
ponadto wklej najlepiej cały skrypt, który ma coś wspólnego z pdo bo z takich skrawków ciezko sie polapac
viking
A spróbuj jeszcze
  1. $r = $pdo->prepare("DELETE ... );
  2. $r->execute();
  3. $r->closeCursor();

I dopiero drugie. Choć moim zdaniem to nie wina PDO.
Kshyhoo
  1. $pdo->exec("DELETE FROM g_associations_players WHERE player_id=".$player['player']." AND association_id=".$player['id_association']);
  2. if(!$pdo->exec()) print_r($pdo->errorInfo());


w obu przypadkach:
Warning: PDO::exec() expects exactly 1 parameter, 0 given in

Turson
Prepare execute errorinfo a nie exec i errorinfo
dokładnie jak w poście http://forum.php.pl/index.php?s=&showt...t&p=1098039
Kshyhoo
To samo:
Warning: PDO::exec() expects exactly 1 parameter, 0 given in ...
Array ( [0] => 00000 )
viking
Przecież ten if jest bez sensu. Exec zwraca ilość zmodyfikowanych wierszy. Więc $ilosc = $pdo->exec a następnie if ($ilosc > 0). Albo od razu if (exec)
Turson
Cytat(Kshyhoo @ 4.04.2014, 18:38:53 ) *
To samo:
Warning: PDO::exec() expects exactly 1 parameter, 0 given in ...
Array ( [0] => 00000 )

Pokaż kod
Kshyhoo
Już sobie poradziłem, zmieniłem pętelki smile.gif

Hmm, a jak mam sobie poradzić z takim zapytaniem? Oczywiście, można pętlą, ale czy PDO zmoże takie cudo?
  1. mysql_query("INSERT INTO messages (m_od, m_do, wiadomosc, data)
  2. SELECT 1, user, '".$txt."', now()
  3. FROM users");
nospor
PDO wykonuje kazde zapytania. Niby czemu ma sobie nie poradzic i z tym?
Kshyhoo
No tak, ale jak to zbindować?
nospor
Normalnie, jak zawsze. Niczym to sie nie rozni od kazdego innego normalnego bidowania. Probowales? Pokaz jak. Nie? To sprobuj
Kshyhoo
  1. $m_od = 1;
  2. $wiadomosc = 'PDO to zło';
  3.  
  4. $b = $pdo->prepare("INSERT INTO messages (m_od, m_do, wiadomosc, data)
  5. SELECT :m_od, :user, :txt, now()
  6. FROM users");
  7. $b->bindValue(":m_od", $m_od);
  8. $b->bindValue(":wiadomosc", $wiadomosc);
  9. $b->execute();

Sypie błędem:
Cytat
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in ...
nospor
facepalmxd.gif
Zacznij czytac komunikaty bledow. Wyraznie ci napisano, ze liczba bindowanych elementow nie zgadza sie z liczba elementow jakie okresliles do bindowania....
Nawet nie zgadzają sie wszystkie nazwy :/

cchesz bindowac: :m_od, :user, :txt
a bindujesz:
$b->bindValue(":m_od", $m_od);
$b->bindValue(":wiadomosc", $wiadomosc);

Naprawde tego nie widzisz??
Kshyhoo
Ach te pogańskie języki... nie zrozumiałem dobrze treści komunikatu smile.gif
  1. $b->bindValue(":user", 'user');

To mi wyśle tyle wiadomości, ile jest userów w bazie do pierwszego ID.
nospor
Cytat
To mi wyśle tyle wiadomości, ile jest userów w bazie do pierwszego ID.
Ty sie chwalisz czy stwierdzasz problem? Jak zrobiles tak masz.
Po co w select okreslaszs wartosci na stale? PRzeciez to w tej chwili nie ma najmniejszego sensu. Nie sadzisz ze w select powinny pojsc wartosci z tabeli a nie wszystkie na stale okreslone przez Ciebie? Co najwyzej wiadomosc powinna pojsc okreslona przez Ciebie, a reszta powinny pojsc dane z tabeli

No i OD tez powinno byc chyba twoje. Tylko DO ma pojsc jako wartosc z tabeli, wiec:
$b = $pdo->prepare("INSERT INTO messages (m_od, m_do, wiadomosc, data)
SELECT :m_od, POLE_USER_Z_TABELI_A_NIE_NA_STALE_OKRESLONE, :txt, now()
FROM users");
Kshyhoo
Moim zdaniem, tylko do kogo wysłać powinno pójść z tabeli, bo to ma być wiadomość do wszystkich.
nospor
Cytat
Moim zdaniem, tylko do kogo wysłać powinno pójść z tabeli, bo to ma być wiadomość do wszystkich.
No i tak przeciez napisalem. Poza tym skoro sam to wiesz, to czemu od poczatku robisz inaczej?
Kshyhoo
No dobrze prawisz, tylko ja nie wiem, jak to mam zrobić w PDO. Zresztą, czy tych userów muszę bindować?
nospor
Przeciez ci podalem gotowy kod....
$b = $pdo->prepare("INSERT INTO messages (m_od, m_do, wiadomosc, data)
SELECT :m_od, POLE_USER_Z_TABELI_A_NIE_NA_STALE_OKRESLONE, :txt, now()
FROM users");
Kshyhoo
  1. $m_od = 1;
  2. $wiadomosc = 'PDO to zło';
  3.  
  4. $b = $pdo->prepare("INSERT INTO messages (m_od, m_do, wiadomosc, data)
  5. SELECT :m_od, user, :txt, now()
  6. FROM users");
  7. $b->bindValue(":m_od", $m_od);
  8. $b->bindValue(":wiadomosc", $wiadomosc);
  9. $b->execute();
nospor
znajdz 10 roznic
:txt
:wiadomosc

Juz ci o tym pisalem w poprzednich postach :/
Kshyhoo
To tylko różnica przy edycji na potrzeby Forum ;p Inaczej by sypało błędem. Dzięki za pomoc.
nospor
Czy ty mi wlasnie probujesz powiedziec, ze zamiana
$b->bindValue(":wiadomosc", $wiadomosc);
na
$b->bindValue(":txt", $wiadomosc);
sypie bledem na forum?

ps: chyba nie, bo jakos ten post mi sie udalo napisac bez bledu wink.gif
Kshyhoo
No tak, ale ja jestem miszczem CTRL+C i CTRL+V...

Coś nie mogę skumać. Kod:
  1. $del = $pdo->exec("DELETE FROM messages WHERE m_od=$user");

Rozumiem, ze $del przechowuje ilość usuniętych rekordów, czyli przy 3 usuniętych:
  1. echo $del;

Wyświetli 3. Czyli stare:
  1. if($ile == 0)
  2. return "nie usunięto";
  3. else
  4. return "usunięto";

jest niepotrzebne i mogę zrobić tak:
  1. if($del == 0)
  2. return "nie usunięto";
  3. else
  4. return "usunięto";

Dla jasności, cała funkcja (zakomentowana stara wersja:
  1. function del_mess($user, $id) {
  2. global $pdo;
  3. $id = (int)$id;
  4. $user = (int)$user;
  5.  
  6. /* mysql_query("DELETE FROM messages WHERE id=$id AND m_do=$user"); */
  7. $del = $pdo->exec("DELETE FROM messages WHERE id=$id AND m_do=$user");
  8.  
  9. /* if(mysql_affected_rows() == 0) { */
  10. if($del == 0) {
  11. return "nie usunięto";
  12. } else {
  13. return "usunięto";
  14. }
  15.  
  16. }

Wywołanie funkcji:
  1. if(!empty($_GET['del'])) {
  2. require_once('del_mess.php');
  3. $msg = del_mess($User['user'], $_GET['del']);
  4. }

Myślę dobrze? Bo usuwa, ale nie wyświetla wiadomości o usunięciu.
Kshyhoo
Ale czy dobrze myślę? Czyli:
  1. $del = $pdo->prepare();
  2. $del->execute("DELETE FROM messages WHERE m_od=$user");
  3.  
  4. $ile = $del->rowCount();
  5. if($ile == 0)
  6. return "nie usunięto";
  7. else
  8. return "usunięto";

questionmark.gif
Dalej nie mam komunikatu.
nospor
A wyswietlasz gdzies te $msg questionmark.gif
Kshyhoo
No tak:
  1. if(!empty($_GET['del'])) {
  2. require_once('del_mess.php');
  3. $msg = del_mess($User['user'], $_GET['del']);
  4. }

Wyżej mam funkcję, która wysyła wiadomość i ta działa:
  1. if(!empty($_POST['m_do']) && !empty($_POST['txt'])) {
  2. require_once('send_mess.php');
  3. $msg = send_mess($User['user'], $_POST['m_do'], $_POST['txt']);
  4. }


Na końcu pliku mam:
  1. echo $msg. '
  2. <form ...>
  3.  
  4. </form>
  5. ';
nospor
$msg = send_mess($User['user'], $_POST['m_do'], $_POST['txt']);
przeciez tutaj nadpisujesz zmienna $msg....
Kshyhoo
No gdzie? Przecież to zadziała po wysłaniu formularza. U mnie if(!empty($_GET['del'])) { wywoła funkcję usunięcia i powinno zwrócić wiadomość.
nospor
var_dump($ile);
Wyswietla ci poprawnie? Znaczy ze gdzies te $msg po drodze albo gubisz, albo nadpisujesz. Proste. Poszukaj gdzie
Kshyhoo
No w funkcji zwraca ilość usuniętych rekordów.
Jak wyślę wiadomość, czyli skorzystam z kodu do wysłania, zwraca komunikat a funkcje są podobne, jedynie zmienne i zapytania inne.

Dodałem na końcu skryptu echo $msg to wyświetla komunikat. Dziwne, bo przecież powinno zwrócić w funkcji, tak jak inne.
Turson
Return to nie echo, więc należy dać echo funkcja()
Kshyhoo
No tak, tylko ja chcę wyświetlić to, co zwraca funkcja, czyli $msg.
Turson
Wrzuć cały kod, która ma coś z tym wspólnego to się znajdzie przyczynę
Kshyhoo
Wróciłem wink.gif Mam takie zapytanie:
  1. $ts = $pdo->query("SELECT *
  2. FROM g_ts
  3. WHERE user_id=".$User['user']);
  4.  
  5. while($t = $ts->fetch()) { // <-- linia 73

Dane (kilka wartości) wyświetlam w tabeli. Jak najlepiej zliczyć wartości w kolumnach? Jak dam cokolwiek, np.:
  1. SELECT name, ..., SUM(r1) AS suma_r1

Wywala mi bląd Fatal error: Call to a member function fetch() on a non-object in ... on line 73.
viking
query może zwrócić false. Kurcze. Męczysz ten wątek już 5 stronę i w ogóle nie czytasz dokumentacji.
Kshyhoo
Cytat(viking @ 11.04.2014, 08:17:04 ) *
Kurcze. Męczysz ten wątek już 5 stronę i w ogóle nie czytasz dokumentacji.

Ja mam zaledwie trzecią. A dokumentacja w pogańskim języku...
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.