Frage von MinecrafterPG, 28

Warum kommt ein Fehler bei dieser SELECT COUNT(*)-Abfrage?

Hi Leute,

ich habe eine Frage, nämlich wieso bei folgender Abfrage bei PHP ein Fehler auftritt. Es ist ja eine COUNT Abfrage, das heißt, dass dort auch kein Fehler kommen sollte, wenn es den Datensatz nicht gibt. Trotzdem erscheint der Call to a member function fetch_row() on a non-object Error.

    $result = $mysqli->query("SELECT COUNT(*) FROM `coupons` WHERE `coupon_code` = ".$_POST['coupon_code']." AND `active` = 1");
    $row = $result->fetch_row();

Warum kommt dort nun ein Error, wenn der Datensatz nicht existiert? Wenn er existiert passiert nichts, das ist das merkwürdige.

LG

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von MonkeyKing, 17

Ich denke weil 

$_POST['coupon_code'] 

ein String ist, du also noch Quotes (') hinzufügen musst.

    $result = $mysqli->query("SELECT COUNT(*) FROM `coupons` WHERE `coupon_code` = '".$_POST['coupon_code']."' AND `active` = 1");
$row = $result->fetch_row();
Kommentar von MinecrafterPG ,

Das war der Fehler :D Danke

Kommentar von MonkeyKing ,

Ja, das wundert mich dann auch.. Mach doch mal ein print_r($_POST['coupon_code]); um zu sehen was drin ist.

Kleiner Hinweis noch: dein Code enthält eine riesige Sicherheitslücke. Indem du ungeprüft den Inhalt der POST Variable einfügst, kann man beliebigen SQL code ausführen. Auch so nette Sachen wie "DROP DATABASE". Das nennt man SQL Injection. Das musst du unterbinden!  Schau mal hier:

http://php.net/manual/de/security.database.sql-injection.php

Kommentar von MinecrafterPG ,

Okay

Antwort
von triopasi, 18

Nimm die SQL-Abfrage mal und führ die in PHPMyAdmin aus, um zu sehen was rauskommst... 

PS: Kannst auch mysqli_affected_rows nutzen...

Antwort
von DustFireSky, 16

Weil du was vergessen hast :D

$row = $result->fetch_row($result);
Kommentar von MinecrafterPG ,

Kann nicht sein, weil wenn der Datensatz existiert, kommt der Error nicht :)

Kommentar von DustFireSky ,

Dann frage ich mal anders:

".$_POST['coupon_code']."

Was ist das für ein Datentyp ? Integer ? Schickst du evtl. einen String, wenn der Coupon Code leer ist ? Außerdem ist das sehr unklug, was du da machst! Man verarbeitet keine Superglobals direkt in einem Query ohne diese zu filtern.

Wenn es Integer Werte sind schreib => intval(".$_POST['coupon_code'].")

bei Text =>

mysqli_real_escape_string(".$_POST['coupon_code'].")

Du solltest dir das trotzdem angewöhnen, damit auch immer klar ist, auf welches query sich das fetch_row bezieht.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten