Guy Gaz: mysqli - Unterschied prepared Statement und direkte Query

Hallo!

Bei meinem Unterfangen, meine angestaubten PHP-Klassen etwas zu erneuern (Umstellung auf 5.2 +, Nutzung der MySQL Improved Extension etc.) bin ich auf folgendes gestoßen:

  
  
/* prep. stmt. Versuch*/  
$ob    = new StdClass();  
$mysqli    =    new Mysqli('localhost', 'root', '#+#', 'koch');  
$stmt      =    $mysqli->prepare('SELECT  ingredients FROM content WHERE id=?');  
$id        =    92;  
$stmt->bind_param("i", $id);  
$stmt->execute();  
$stmt->bind_result($ob->ingredients);  
$stmt->fetch();  
var_dump($ob->ingredients);  
  
/* direkte query */  
  
$id        =    92;  
$mysqli    =    new Mysqli('localhost', 'root', '#+#', 'koch');  
$result    =    $mysqli->query('SELECT  ingredients FROM content WHERE id='.$id);  
$ob        =    $result->fetch_object();  
var_dump($ob->ingredients);  

Beide Queries greifen auf das Attribut ingredients des Datensatzes mit ID=92 der Entity koch.content zu.
Die Abfragen wurden (mehrfach versucht) direkt nacheinander ausgeführt. Ich nutze die DB alleine und es wurden keinerlei Änderungen hieran vorgennommen, dennoch sind die Ergebnisse (Ausgaben von var_dump() hier gekürzt wegen der Länge) unterschiedlich:

Im 1. Fall:

string(256) "Lorem ipsum dolor sit amet, con ..."

Im 2. Fall:

string(3023) "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod..."

Dieses Verhalten ist mit anderen Datensätzen und -feldern reproduzierbar und wurde mit verschiedenen Datentypen für das auszulesende Attribut (text, blog und long* etc.) getestet.

Variante 1 mit dem prepared Statement gibt mir immer nur maximal 256 Bytes zurück.
Warum? Was übersehe ich dabei?

Nur der Vollständigkeit halber: greife ich mit anderen Clients auf den jeweiligen Datensatz zu bekomme ich (natürlich) im obigen Beispiel den 3023 Bytes langen String geliefert.

Vielen Dank für Eure Tipps!

Ciao

GG

--
"If I do not seek to understand what is happening here
- then I've got peanuts in my head!"
(I. Hosein)
  1. Hallo!

    Im 1. Fall:

    string(256) "Lorem ipsum dolor sit amet, con ..."

    Im 2. Fall:

    string(3023) "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod..."

    Auch wenn du deine extra Klasse (StdClass) mal weglässt?
    Also:

      
    $mysqli    =    new Mysqli('localhost', 'root', '#+#', 'koch');  
    $stmt      =    $mysqli->prepare('SELECT  ingredients FROM content WHERE id=?');  
    $id        =    92;  
    $stmt->bind_param("i", $id);  
    $stmt->execute();  
    $stmt->bind_result($ingredients);  
    $stmt->fetch();  
    var_dump($ingredients);  
    
    

    Gruß Gunther

    1. Hallo!

      Auch wenn du deine extra Klasse (StdClass) mal weglässt?

      Ja, auch dann ich nutze das StdObject hier nur exemplarisch - egal welche Variable ich in der Methode bind_result() angebe, ich erhalte maximal 256 Bytes:((

      Ciao

      GG

      --
      "If I do not seek to understand what is happening here
      - then I've got peanuts in my head!"
      (I. Hosein)
  2. Hi!

    dennoch sind die Ergebnisse (Ausgaben von var_dump() hier gekürzt wegen der Länge) unterschiedlich:

    Das kann ich bei mir nicht nachvollziehen. Wie ist denn die abzufragende Spalte konfiguriert? (Vergleiche Userkommentar brad dot jackson at resiideo dot com.)

    Lo!

    1. Hallo!

      dennoch sind die Ergebnisse (Ausgaben von var_dump() hier gekürzt wegen der Länge) unterschiedlich:

      Das kann ich bei mir nicht nachvollziehen.

      Ja: so etwas habe ich schon befürchtet.

      Wie ist denn die abzufragende Spalte konfiguriert?

      Wie beschrieben, habe ich das mit unterschiedlichsten Datentypen (text, blob - auch medium*, long* etc.) versucht - immer maximal 256 _Bytes_!

      (Vergleiche Userkommentar brad dot jackson at resiideo dot com.)

      Ja das habe ich schon gesehen - php.net ist immer meine erste Anlaufstelle - bevor ich frage, digge ich immer selbst;)

      Danke!

      Ciao

      GG

      --
      "If I do not seek to understand what is happening here
      - then I've got peanuts in my head!"
      (I. Hosein)
  3. Hi,

    Variante 1 mit dem prepared Statement gibt mir immer nur maximal 256 Bytes zurück.
    Warum? Was übersehe ich dabei?

    Problem nachvollziehbar.
    Erklärung/Lösung: keine.
    Das Problem ist mir vor ein paar Tagen anderswo schon mal über den Weg gelaufen, konnte dort aber auch nicht zufriedenstellend gelöst werden.

    Und Google liefert mir auch kaum brauchbare Infos - ausser, dass ein paar Leute offenbar das gleiche Problem haben.

    Nur der Vollständigkeit halber: greife ich mit anderen Clients auf den jeweiligen Datensatz zu bekomme ich (natürlich) im obigen Beispiel den 3023 Bytes langen String geliefert.

    Nutzt du dabei dann auch Prepared Statements?

    Welche Client API library version gibt phpinfo() im Abschnitt MySQLi an?
    Auf dem Server, wo ich das Problem nachvollziehen kann, aktuell 5.0.51a (unter PHP 5.3.0).

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hallo!

      Variante 1 mit dem prepared Statement gibt mir immer nur maximal 256 Bytes zurück.
      Warum? Was übersehe ich dabei?

      Problem nachvollziehbar.
      Erklärung/Lösung: keine.

      Na super;)

      Das Problem ist mir vor ein paar Tagen anderswo schon mal über den Weg gelaufen, konnte dort aber auch nicht zufriedenstellend gelöst werden.

      Und Google liefert mir auch kaum brauchbare Infos - ausser, dass ein paar Leute offenbar das gleiche Problem haben.

      Ja, habe ich gesehen.

      Nur der Vollständigkeit halber: greife ich mit anderen Clients auf den jeweiligen Datensatz zu bekomme ich (natürlich) im obigen Beispiel den 3023 Bytes langen String geliefert.

      Nutzt du dabei dann auch Prepared Statements?

      Nein.

      Welche Client API library version gibt phpinfo() im Abschnitt MySQLi an?
      Auf dem Server, wo ich das Problem nachvollziehen kann, aktuell 5.0.51a (unter PHP 5.3.0).

      Mysql Client API version 5.1.37 - ich dachte, ich hätte das im Nachtrag geschrieben, aber ich habe wohl nach 2 mal 'Vorschau' benutzend die Nachricht nicht abgesendet :(.

      Danke!

      Ciao

      GG

      --
      "If I do not seek to understand what is happening here
      - then I've got peanuts in my head!"
      (I. Hosein)