[MySQL/PHP] num_rows funnktioniert nicht?

...komplette Frage anzeigen

4 Antworten

Hello there,

dein Problem entsteht insbesondere durch das, was Maximilian dir schon erklärt hat. Du bist aber auch ein bisschen selbst schuld, weil du prozedurale und objektorientierte Schreibweise mischst.

Berücksichtige bitte auch Folgendes: Bei der alten MySQL-Schnittstelle ist nur prozedurale Schreibweise möglich: Hier muss ZUERST das SQL-Statement kommen und dann die Datenbankverbindung:

mysql_query($sql, $db);

Bei der verbesserten Variante MySQLi ist es ungeschickterweise umgekehrt:

mysqli_query($db, $sql);

Am einfachsten tust du dir, wenn du immer die verbesserte Variante nimmst und dann objektorientiert arbeitest. Da du hier bereits eine Methode eines Objektes aufrufst, brauchst du keine Referenz mehr auf dieses Objekt, sondern musst nur noch deinen SQL-Query angeben:

$db->query($sql);

Eins noch: Bei der alten Schnittstelle ist die Angabe der Datenbankressource optional, erfolgt sie nicht, wird die zuletzt angenommene Verbindung zu einem MySQL-Server angenommen. In Mysqli ist das nicht mehr möglich, hier MUSS eine Verbindungskennung angegeben werden.

Hoffe das hilft dir erstens weiter und erklärt zudem die auftretene Problematik noch etwas.

MfG

Alex

Deine Abfrage ist bei der Where-Klausel unvollständig.

Oh da war ich wohl blind.. Jedoch auch nach Vollendung erscheint die selbe meldung erneut..

code:

http://pastebin.com/URUF59Lr

0
@pfuffi

Naja, das kann nicht funktionieren.

Versuchs mal so:

$sql= "SELECT * FROM objects WHERE obj_id=".$_GET['id'];
0
@pfuffi

Was kommt jetzt für eine Meldung?

Steht etwas in $_Get['id'] drin? Stimmen die Tabelle- / Spaltennnamen? Funktioniert die Datenbankverindung?

0

wie die fehlermeldung sagt ist

mysqli_query($sql, $db);

falsch, muss heissen:

mysqli_query($db, $sql);

davon abgesehen: die select anweisung ist überflüssig. wenn delete nix findet wird auch nix gelöscht, das ist kein fehler.

...Naja ich muss mich besser konzentrieren denk ich... Hat mir geholfen danke!

0

Die Idee, das DELETE nicht auszuführen wenn kein Ergebnis bei SELECT kommt ist, ja nicht so sehr verkehrt. Allerdings haste natürlich recht, dass man das nicht so macht. Aber man könnte ja folgendes machen:

try
{
        if (!$db->query("DELETE FROM objects WHERE obj_id ='" . $_GET['id'] . "'"))
        {
                throw new mysqli_sql_exception("Der angeforderte Eintrag existiert nicht");
        }
}
catch (mysqli_sql_exception $e)
{
        echo $e->getMessage();
}

Dann braucht man auch den Blödsinn mit dem SELECT nicht mehr :D

1
@Alextoexplain

entweder hab ich recht oder dein code ist falsch: ich behaupte die exception wird NICHT geworfen, wenn die bedingung im delete nicht zutrifft - es wird stillschweigend NICHTS gemacht. das liegt in der philosophie des relationenmodells: wir arbeiten mit mengen. und eine null-menge ist eine menge wie jede andere auch.

also deine $db->query meldet auch true zurück, wenn nichts gelöscht wurde.

deine exception wird geworfen, wenn das statement einen syntaxfehler enthält, oder die db-verbindung nicht zustande kam.

wenn man wissen will, wieviel sätze gelöscht wurden, kann die affected_rows funktion verwendet werden: if ( $db->affected_rows == 0) ...

1
@maximilianus7

Hey, gute Frage eigentlich.

Ich bin mir gar nicht sicher. Das kommt nämlich drauf an, wie MySQL reagiert, wenn man einen Datensatz löschen will, der nicht vorhanden ist. Ich möchte meinen, das gibt nen Fehler. Und wenn ein Fehler geworfen wird, gibt Mysqli_query in der Regel auch false zurück. Was das mit dem Relationsmodell zu tun haben soll weiß ich nicht. Und nen NULL kommt da eh nicht zurück, abgesehen davon wäre ein NULL auch false in PHP. Es kann ja nur entweder True oder False kommen, da es ein schreibender Zugriff ist.

Die Exception wird aber TROTZDEM nicht geworfen, was mein Fehler ist, da diese spezielle von mir verwendete mysql_sql_exception nur dann geworfen wird, wenn man vorher schreibt:

mysqli_report(E_STRICT); 

:)

vll sollte er einfach nur eine normale Exception werfen.

0

Line 10 ist bei der deklarierung der Variable $res

Was möchtest Du wissen?