Problem mit mysqli

Alles, was PHP betrifft, kann hier besprochen werden.

Problem mit mysqli

Postby smoon » 31. August 2009 11:07

Hallo,

ich versuche mich gerade daran eine Klasse für MySql zu schreiben, jedoch komme ich an einer Stelle nicht weiter. Meine "SELECT"-Funktion sieht folgender Maßen aus:

Code: Select all
function select($tabelle, $keys, $optionen = "") {
         $spalten = "";
         
         foreach($keys as $k) {
            $spalten .= $k.", ";
         }
         
         $spalten = substr($spalten, 0, -2);
      
         $sql = "SELECT ".$spalten." FROM ".$tabelle." ".$optionen;
                  
         if (!$this->db->query($sql)) {
            $this->error = "Konnte Query nicht ausführen: ".$this->db->error." (".$this->db->errno.")<br>[".$sql."]";
            return false;
         }
         
         if(!$ergebnis = $this->db->store_result()) {
            $this->error = "Konnte Ergebnis nicht lesen: ".$this->db->error." (".$this->db->errno.")";
            return false;
         }
         else {         
            $i = 0;
            
            while ($zeile = $ergebnis->fetch_assoc()) {
               $daten[$i++] = $zeile;
            }
            
            return $daten;
         }
      }


Jetzt wird jedoch immer der Fehler "Konnte Ergebnis nicht lesen" ausgegeben. Jedoch liefert mysqli selber keinen Fehler zurück, daher weiß ich grad nicht wo dieser liegt. Lasse ich diese Abfrage weg, liefert PHP beim Aufruf von "$ergebnis->fetch_assoc()" den Fehler, dass "$ergebnis" kein Objekt sei.

Mein Testaufruf sieht so aus:

Code: Select all
$spalten = array("id", "eintrag");
   if($ergebnis = $dbase->select("tabelle", $spalten)) {
      foreach($ergebnis as $zeile) {
         echo "(".$zeile['id'].") ".$zeile['eintrag']."<br>";
      }
   }
   else {
      die($dbase->error());
   }


Vllt. kann mir einer von euch mal wieder helfen :)
smoon
 
Posts: 10
Joined: 28. August 2009 10:22

Re: Problem mit mysqli

Postby smoon » 31. August 2009 12:21

Konnte den Fehler jetzt doch selbst finden. "store_result()" wird anscheinend nur bei "multi_query()" verwendet.
smoon
 
Posts: 10
Joined: 28. August 2009 10:22

Re: Problem mit mysqli

Postby Nobbie » 31. August 2009 14:14

Das ist aber nicht der wahre Fehler, store_result() sollte es auch bei einzelnen Selects tun.

Ganz sicher jedoch ist diese Zeile syntaktischer Blödsinn:

Code: Select all
if(!$ergebnis = $this->db->store_result()) {


Schau mal genau hin, was da entscheidendes fehlt (und dadurch vollkommen sinnentstellt wird).
Nobbie
 
Posts: 8768
Joined: 09. March 2008 13:04

Re: Problem mit mysqli

Postby Wiedmann » 31. August 2009 14:32

Schau mal genau hin, was da entscheidendes fehlt (und dadurch vollkommen sinnentstellt wird).

Der Zuweisungsoperator ist Syntaktisch korrekt und an dieser Stelle auch gewollt.

Zuerst wird der Wert von "$this->db->store_result()" in der Variablen $ergebnis abgespeichert ("="), dann die Variable $ergebnis negiert ("!"), und dieses Resultat dann für das "if" benutzt.
--> "!" und "=" werden jeweils von rechts nach links ausgewertet.

(eben dadurch kann man dann gleich im "else", wenn also $ergebnis nicht false ist, auf den Inhalt von $ergebnis zugreifen.)
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: Problem mit mysqli

Postby Nobbie » 31. August 2009 14:54

Wiedmann wrote:Zuerst wird der Wert von "$this->db->store_result()" in der Variablen $ergebnis abgespeichert ("="), dann die Variable $ergebnis negiert ("!"), und dieses Resultat dann für das "if" benutzt.
--> "!" und "=" werden jeweils von rechts nach links ausgewertet.


Mit Sicherheit nicht - und es ist auch kein Zufall, dass diese Abfrage in die "Hose" geht, aber dennoch keinerlei MySQL Error ausgegeben werden (das müßte ja der Fall sein, wenn diese Syntax richtig wäre). Es fehlt die alles entscheidende Klammer, da nach allgemeinen Programmierrichtlinien boolsche Operator vor Zuweisungen ausgeführt werden. Richtig müßte es so aussehen:

Code: Select all
if (!($ergebnis = $this->db->store_result())) {


Es wird ja die if-Abfrage ausgeführt (also die eigene Fehlermeldung wird angezeigt), aber dennoch keine MySQL-Fehlermeldung ausgegeben - genau das ist der Effekt der falschen Syntax.
Nobbie
 
Posts: 8768
Joined: 09. March 2008 13:04

Re: Problem mit mysqli

Postby Wiedmann » 31. August 2009 14:58

Mit Sicherheit nicht

Ganz wie du meinst.
Oder machst einfach mal ein "var_dump(!$a = true);" bzw. "var_dump(!$a = false);"

a nach allgemeinen Programmierrichtlinien boolsche Operator vor Zuweisungen ausgeführt werden.

Die Wertigkeit von "!" ist tatsächlich höher als "=". HIer hat man aber einen "Sonderfall". Du kannst das natürlich auch selbst im PHP Manual nachlesen (Operator Precedence), wo genau das beschrieben ist.


Richtig müßte es so aussehen

Ist in dem Fall das selbe, auch wenn es meist, nicht unbedingt hier, einfacher zu lesen ist, wenn man passende Klammern setzt.)
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: Problem mit mysqli

Postby Nobbie » 31. August 2009 15:22

Tatsächlich steht da dieses: (man kann es echt nicht glauben).

Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.


Das PHP Team gibt sich ja wirklich Mühe - aber das ist kein "Sonderfall", sondern schlicht falsch programmiert. Die richtige Reaktion wäre ein Fatal Error, weil man einem "L-Value" bzw. Konstanten keinen Wert zuweisen kann (ähnlich falsch wie so eine Zuweisung: 'Hallo' = $a;). In jeder anderen Sprache (sowieso in C) ist das ein Compiler Abbruch.

Bleibt dann die Frage, wieso MySQL ein FALSE zurückgibt und dennoch weder Errno gesetzt noch eine Fehlermeldung erfolgt?
Nobbie
 
Posts: 8768
Joined: 09. March 2008 13:04


Return to PHP

Who is online

Users browsing this forum: No registered users and 4 guests