2012-02-22 10 views
17

Próbuję uzyskać liczbę wierszy dotkniętych w prostym kwerendy aktualizacji mysql. Jednak po uruchomieniu tego kodu poniżej, PHP mysql_affected_rows() zawsze równa się 0. Nie ma znaczenia, że ​​już foo = 1 (w takim przypadku funkcja powinna poprawnie zwrócić 0, ponieważ nie zmieniono żadnych wierszy), lub jeśli foo jest obecnie równa inna liczba całkowita (w takim przypadku funkcja powinna zwrócić 1).mysql_affected_rows() zwraca 0 dla instrukcji UPDATE, nawet jeśli aktualizacja faktycznie się dzieje

$updateQuery = "UPDATE myTable SET foo=1 WHERE bar=2"; 
mysql_query($updateQuery); 
if (mysql_affected_rows() > 0) { 
    echo "affected!"; 
} 
else { 
    echo "not affected"; // always prints not affected 
} 

Instrukcja UPDATE sama w sobie działa. INT zmienia się w mojej bazie danych. Sprawdziłem również dwukrotnie, czy połączenie z bazą danych nie jest wcześniej zamykane, czy coś ciekawego. Należy pamiętać, że mysql_affected_rows nie wymaga podania identyfikatora połączenia, chociaż ja też tego próbowałem.

Szczegóły dotyczące funkcji: mysql_affected_rows

jakieś pomysły?

+1

jesteś pewien zapis jest aktualizowany? Upewnij się, że ustawiłeś foo na wartość inną niż 1 przed uruchomieniem testu. – northpole

+3

Czy przypadkiem Twoja strona mogłaby zostać wywołana dwa razy, na przykład z powodu przepisania reguły? To spowodowałoby aktualizację danych za pierwszym razem, a nie za drugim razem, gdy zobaczysz ostateczne wyjście ... Nie zaszkodzi sprawdzić dzienniki serwera WWW. –

+0

Czy potwierdziłeś, że faktycznie zwraca 0, a nie wartość ujemną? – Jodaka

Odpowiedz

-1

Was My Tought!

Właśnie miałem powiedzieć, aby sprawdzić, czy funkcja jest wywoływana wiele razy!

Tylko trochę rada:

spróbować użyć isset() & POST/GET czy coś takiego;

if (isset($_POST['Update'] == 'yes')) : 

// your code goes here ... 

endif; 

nadzieję, że było jasne i użyteczne, Ciao :)

+1

Nie można użyć isset() na wyniku wyrażenia. – Cedric

0

Spróbuj podłączyć tak:

$connection = mysql_connect(...,...,...); 

a następnie wywołać jak ten

if(mysql_affected_rows($connection) > 0) 
    echo "affected"; 
} else { ... 
0

myślę trzeba spróbuj czegoś innego w aktualizacji, a następnie foo = 1. Umieść coś zupełnie innego, niż zobaczysz, czy aktualizuje się, czy nie, bez pętli. jeśli tak, to twoja pętla if powinna działać.

0

Pracujesz to?

$timestamp=mktime(); 
$updateQuery = "UPDATE myTable SET foo=1, timestamp={$timestamp} WHERE bar=2"; 
mysql_query($updateQuery); 

$updateQuery = "SELECT COUNT(*) FROM myTable WHERE timestamp={$timestamp}"; 
$res=mysql_query($updateQuery); 
$row=mysql_fetch_row($res); 
if ($row[0]>0) { 
    echo "affected!"; 
} 
else { 
    echo "not affected"; 
} 
19

Nowsze wersje MySQL są na tyle sprytny, aby zobaczyć, czy modyfikacja jest wykonywana, czy nie. Powiedzmy, że wywołałeś instrukcję UPDATE:

UPDATE tb_Employee_Stats SET lazy = 1 WHERE ep_id = 1234 

Powiedzmy, jeśli wartość kolumny wynosi już 1; następnie nie następuje proces aktualizacji, dlatego mysql_affected_rows() zwróci 0; jeśli leniwy kolumna ma inną wartość niż 1, to zwracana jest 1. Nie ma innych możliwości poza ludzkimi błędami.

+5

+1. Nie wiedziałem, że to jest – asprin

+1

, co utrudniało mi życie. Teraz mogę zaktualizować mój kod, aby ominąć to. – zeeshan

1

mysqli_affected_rows wymaga podania odniesienia do połączenia z bazą danych jako jedynego parametru zamiast odwołania do zapytania mysqli. na przykład.

$dbref=mysqli_connect("dbserver","dbusername","dbpassword","dbname"); 

$updateQuery = "UPDATE myTable SET foo=1 WHERE bar=2"; 

echo mysqli_affected_rows($dbref); 

NIE

echo mysqli_affected_rows($updateQuery); 
0

Poniższe wskazówki będą pomocne dla ciebie,

mysql_affected_rows() zwraca

  • +0: rząd nie został zaktualizowany lub włożona (prawdopodobnie dlatego, że wiersz już istniał, ale nie zmieniono wartości pól podczas aktualizacja).

  • +1: wiersz wstawiono

  • +2: a rząd został zaktualizowany

  • 1: w przypadku błędu.

mysqli affected rows developer notes

Powiązane problemy