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

Mam kolejny problem, w MySQL:
else {
mysql_query("DELETE FROM g_as_ps WHERE p_id=".$p['p']." AND a_id=".$p['id_a']);
$msg = "załatwione";
}
PDO bez bindowania:
else {
$r = $pdo->exec("DELETE FROM g_as_ps WHERE p_id=".$p['p']." AND a_id=".$p['id_a']);
$q = $pdo->exec("UPDATE g_p SET a_id=0 WHERE p=".$p['p']);
$msg = "załatwione";
}
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.
else
{
$pdo->query('DELETE FROM g_as_ps WHERE p_id='.$p['p'].' AND a_id='.$p['id_a']);
$pdo->query('UPDATE g_p SET a_id=0 WHERE p='.$p['p']);
$msg = 'załatwione';
}
Kshyhoo
4.04.2014, 16:08:48
I tak muszę kliknąć 2x...
Nie mogę nic znaleźć w necie na ten temat. A nie muszę zrobić coś na:
{
$r = $pdo->prepare("DELETE ...
$r->execute();
$r = $pdo->prepare("UPDATE...
$r->execute();
}
Turson
4.04.2014, 16:10:33
$pdo->query('DELETE FROM g_as_ps WHERE p_id='.$p['p'].' AND a_id='.$p['id_a']);
$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
4.04.2014, 16:19:27
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:
<a href="?go=association&leave=ok">opuść
</a>
potem:
} elseif(!empty($_GET['leave'])) { require_once('function/association_leave.php');
$msg = association_leave($User);
a funkcja:
else {
// odejdź
$d = $pdo->prepare("DELETE FROM g_associations_players
WHERE player_id=".$player['player']."
AND association_id=".$player['id_association']);
$d->execute();
$u=$pdo->prepare("UPDATE g_players
SET id_association=0
WHERE player=".$player['player']);
$u->execute();
$msg = "done";
}
Turson
4.04.2014, 16:26:34
$msg = association_leave($User)
a gdzie ją wywołujesz?
Kshyhoo
4.04.2014, 16:31:15
Ten komunikat? Zaraz pod tym:
} elseif(!empty($_GET['leave'])) { require_once('function/association_leave.php');
$msg = association_leave($User);
}
A link jest poniżej klamerek. W czystym MySQL działa normalnie, więc to wina PDO.
ZaXaZ
4.04.2014, 16:32:22
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
4.04.2014, 16: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.
ZaXaZ
4.04.2014, 16:39:04
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
4.04.2014, 16:48:33
Moją metodą, czyli:
{
$r = $pdo->prepare("DELETE ... );
$r->execute();
$r = $pdo->prepare("UPDATE... );
$r->execute();
}
Turson
4.04.2014, 17:12:19
Spróbuj tą metodą
http://forum.php.pl/index.php?s=&showt...t&p=1098039ponadto wklej najlepiej cały skrypt, który ma coś wspólnego z pdo bo z takich skrawków ciezko sie polapac
viking
4.04.2014, 17:26:02
A spróbuj jeszcze
$r = $pdo->prepare("DELETE ... );
$r->execute();
$r->closeCursor();
I dopiero drugie. Choć moim zdaniem to nie wina PDO.
Kshyhoo
4.04.2014, 17:30:39
$pdo->exec("DELETE FROM g_associations_players WHERE player_id=".$player['player']." AND association_id=".$player['id_association']);
if(!$pdo->exec()) print_r($pdo->errorInfo());
w obu przypadkach:
Warning: PDO::exec() expects exactly 1 parameter, 0 given in
Turson
4.04.2014, 17:32:39
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
4.04.2014, 17:38:53
To samo:
Warning: PDO::exec() expects exactly 1 parameter, 0 given in ...
Array ( [0] => 00000 )
viking
4.04.2014, 17:46:38
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
4.04.2014, 18:32:37
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
7.04.2014, 16:32:57
Już sobie poradziłem, zmieniłem pętelki

Hmm, a jak mam sobie poradzić z takim zapytaniem? Oczywiście, można pętlą, ale czy PDO zmoże takie cudo?
mysql_query("INSERT INTO messages (m_od, m_do, wiadomosc, data) SELECT 1, user, '".$txt."', now()
FROM users");
nospor
8.04.2014, 07:41:13
PDO wykonuje kazde zapytania. Niby czemu ma sobie nie poradzic i z tym?
Kshyhoo
8.04.2014, 09:38:56
No tak, ale jak to zbindować?
nospor
8.04.2014, 09:41:27
Normalnie, jak zawsze. Niczym to sie nie rozni od kazdego innego normalnego bidowania. Probowales? Pokaz jak. Nie? To sprobuj
Kshyhoo
8.04.2014, 10:03:42
$m_od = 1;
$wiadomosc = 'PDO to zło';
$b = $pdo->prepare("INSERT INTO messages (m_od, m_do, wiadomosc, data)
SELECT :m_od, :user, :txt, now()
FROM users");
$b->bindValue(":m_od", $m_od);
$b->bindValue(":wiadomosc", $wiadomosc);
$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
8.04.2014, 10:06:31

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
8.04.2014, 10:12:41
Ach te pogańskie języki... nie zrozumiałem dobrze treści komunikatu

$b->bindValue(":user", 'user');
To mi wyśle tyle wiadomości, ile jest userów w bazie do pierwszego ID.
nospor
8.04.2014, 10:16:46
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
8.04.2014, 10:17:21
Moim zdaniem, tylko do kogo wysłać powinno pójść z tabeli, bo to ma być wiadomość do wszystkich.
nospor
8.04.2014, 10:18:13
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
8.04.2014, 10:18:59
No dobrze prawisz, tylko ja nie wiem, jak to mam zrobić w PDO. Zresztą, czy tych userów muszę bindować?
nospor
8.04.2014, 10:19:37
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
8.04.2014, 10:21:55
$m_od = 1;
$wiadomosc = 'PDO to zło';
$b = $pdo->prepare("INSERT INTO messages (m_od, m_do, wiadomosc, data)
SELECT :m_od, user, :txt, now()
FROM users");
$b->bindValue(":m_od", $m_od);
$b->bindValue(":wiadomosc", $wiadomosc);
$b->execute();
nospor
8.04.2014, 10:22:50
znajdz 10 roznic
:txt
:wiadomosc
Juz ci o tym pisalem w poprzednich postach :/
Kshyhoo
8.04.2014, 10:24:49
To tylko różnica przy edycji na potrzeby Forum ;p Inaczej by sypało błędem. Dzięki za pomoc.
nospor
8.04.2014, 10:30:27
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
Kshyhoo
8.04.2014, 15:35:41
No tak, ale ja jestem miszczem CTRL+C i CTRL+V...
Coś nie mogę skumać. Kod:
$del = $pdo->exec("DELETE FROM messages WHERE m_od=$user");
Rozumiem, ze
$del przechowuje ilość usuniętych rekordów, czyli przy 3 usuniętych:
Wyświetli
3. Czyli stare:
if($ile == 0)
return "nie usunięto";
else
return "usunięto";
jest niepotrzebne i mogę zrobić tak:
if($del == 0)
return "nie usunięto";
else
return "usunięto";
Dla jasności, cała funkcja (zakomentowana stara wersja:
function del_mess($user, $id) {
$id = (int)$id;
$user = (int)$user;
/* mysql_query("DELETE FROM messages WHERE id=$id AND m_do=$user"); */
$del = $pdo->exec("DELETE FROM messages WHERE id=$id AND m_do=$user");
/* if(mysql_affected_rows() == 0) { */
if($del == 0) {
return "nie usunięto";
} else {
return "usunięto";
}
}
Wywołanie funkcji:
if(!empty($_GET['del'])) { require_once('del_mess.php');
$msg = del_mess($User['user'], $_GET['del']);
}
Myślę dobrze? Bo usuwa, ale nie wyświetla wiadomości o usunięciu.
Turson
8.04.2014, 15:50:52
Kshyhoo
8.04.2014, 15:59:23
Ale czy dobrze myślę? Czyli:
$del = $pdo->prepare();
$del->execute("DELETE FROM messages WHERE m_od=$user");
$ile = $del->rowCount();
if($ile == 0)
return "nie usunięto";
else
return "usunięto";

Dalej nie mam komunikatu.
nospor
8.04.2014, 16:04:24
A wyswietlasz gdzies te $msg
Kshyhoo
8.04.2014, 16:19:09
No tak:
if(!empty($_GET['del'])) { require_once('del_mess.php');
$msg = del_mess($User['user'], $_GET['del']);
}
Wyżej mam funkcję, która wysyła wiadomość i ta działa:
if(!empty($_POST['m_do']) && !empty($_POST['txt'])) { require_once('send_mess.php');
$msg = send_mess($User['user'], $_POST['m_do'], $_POST['txt']);
}
Na końcu pliku mam:
<form ...>
</form>
';
nospor
8.04.2014, 16:21:37
$msg = send_mess($User['user'], $_POST['m_do'], $_POST['txt']);
przeciez tutaj nadpisujesz zmienna $msg....
Kshyhoo
8.04.2014, 16:24:18
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
8.04.2014, 16:27:42
var_dump($ile);
Wyswietla ci poprawnie? Znaczy ze gdzies te $msg po drodze albo gubisz, albo nadpisujesz. Proste. Poszukaj gdzie
Kshyhoo
8.04.2014, 16:43:51
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
8.04.2014, 17:24:50
Return to nie echo, więc należy dać echo funkcja()
Kshyhoo
8.04.2014, 18:03:14
No tak, tylko ja chcę wyświetlić to, co zwraca funkcja, czyli $msg.
Turson
8.04.2014, 18:12:25
Wrzuć cały kod, która ma coś z tym wspólnego to się znajdzie przyczynę
Kshyhoo
10.04.2014, 21:42:59
Wróciłem

Mam takie zapytanie:
$ts = $pdo->query("SELECT *
FROM g_ts
WHERE user_id=".$User['user']);
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.:
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
11.04.2014, 07:17:04
query może zwrócić false. Kurcze. Męczysz ten wątek już 5 stronę i w ogóle nie czytasz dokumentacji.
Kshyhoo
11.04.2014, 08:44:39
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.