PHP - Einfügen von Binärdaten in mysql mit vorbereiteten Anweisungen

8

Ich muss eine Zeile mit der verbesserten mysql-Bibliothek von php in eine Tabelle in mysql einfügen, deren Primärschlüssel vom Typ VARBINARY ist. Der Inhalt dieses Feldes ist ein berechneter sha1-Hash.

Wenn ich die Abfrage auf die alte Art und Weise durchführe funktioniert es perfekt:

%Vor%

Aber wenn ich versuche, es als eine vorbereitete Aussage auszuführen, kann ich nicht herausfinden, wie es geht. Ob Ich führe die entsprechende Aktion aus:

%Vor%

Es wird eine Ausnahme ausgelöst, die besagt, dass der Inhalt für dieses Feld zu groß ist. Und wenn ich versuche, es als ein BLOB-Feld einzufügen:

%Vor%

Es gibt keinen Fehler, die Zeile wird eingefügt, aber das Feld "Identifier" ist jetzt leer (nicht null, leer).

Ich weiß, dass ich die Abfrage mischen und die in der Zeichenfolge verkettete ID und die anderen Felder als Bindeparameter der vorbereiteten Anweisung eingeben kann, aber ich möchte nur wissen, was der richtige Weg ist, dies einzufügen, und vielleicht wird es auch funktionieren helfen Sie jemandem in der Zukunft.

    
David Espart 17.11.2009, 10:24
quelle

3 Antworten

6

Die Funktion sha1 von PHP gibt eine String-Repräsentation einer Hex-Zahl zurück.

Was das bedeutet, dass wenn Sie es auf dem Bildschirm drucken, wird es eine Hex-Nummer anzeigen. Aber im Speicher ist es eine Reihe von ASCII-Zeichen.

Nimm also die Hexzahl 1A2F . Als ASCII im Speicher wäre das 0x31413246 anstelle von 0x1A2F

Die normale Schnittstelle von MySQL sendet alle Argumente als Zeichenfolgen. Bei Verwendung der normalen Schnittstelle konvertiert MySQL die ASCII-Zeichenfolge in einen binären Wert.

Die neue vorbereitete Anweisungsmethode sendet alles als Binärdatei. Ihr schöner Wert von "1A2F" wird nun als 0x31413246 gesendet und in die Spalte eingefügt. - Quelle: dev.mysql.com - vorbereitete Anweisungen

Konvertieren Sie stattdessen Ihre Hex-Zeichenfolge, indem Sie sie in eine binäre Zeichenfolge packen mit:

%Vor%

und übergeben Sie dann $binId an die vorbereitete MySQLi-Anweisung anstelle von $ id.

    
nash 17.11.2009, 16:41
quelle
3

versuche dies stattdessen:

%Vor%     
longneck 17.11.2009 16:17
quelle
0

tl; dr: Schau dir send_long_data () an.

>

Ich weiß, das ist eine sehr alte Frage, aber es war genau was ich versuchte zu tun und zu versagen. Nachdem ich die obigen Antworten ausprobiert und viel Zeit mit dem Experimentieren verbracht hatte, fand ich endlich etwas, das so funktionierte, wie die Frage und ich es versuchten.

Es ist verwirrend, weil die einzige Referenz dafür, wie man mit "b" in PHP fortfährt bind_param Dokumentation bezieht sich indirekt auf Daten, die die zulässige Paketgröße überschreiten (die ich anfangs übersprungen habe):

  

Wenn die Datengröße einer Variablen max. zulässige Paketgröße   (max_allowed_packet), müssen Sie b in types angeben und verwenden    mysqli_stmt_send_long_data () um die Daten in Paketen zu senden.

Es stellt sich heraus, dass binäre Typen von selbst gesendet werden müssen, bevor Sie Ihre Einfügung ausführen. Ich habe das aus einem Artikel auf der Oracle-Website herausgefunden.

Da sie es so kurz erklären, werde ich nur den relevantesten Teil paraphrasieren:

  

Speichern des Blobs

     

Hier ist der Code zum Speichern eines Blobs mit MySQLi:

%Vor%
  

Ich habe zwei Code-Teile fett geschrieben, die ich zu betrachten glaube:

     

Die Variable $ null wird benötigt, weil bind_param () immer eine Variablenreferenz für bestimmte Parameter haben möchte. In diesem Fall das "b" (wie in   Blob) Parameter. Also $ null ist nur ein Dummy, um die Syntax zu verbessern.

     

Im nächsten Schritt muss ich meinen Blob-Parameter mit den eigentlichen Daten füllen. Dies geschieht durch send_long_data () . Der erste Parameter von   Diese Methode gibt an, welchem ​​Parameter die Daten zugeordnet werden.   Die Parameter sind mit 0 beginnend nummeriert. Der zweite Parameter von    send_long_data () enthält die eigentlichen zu speichernden Daten.

     

Stellen Sie bei Verwendung von send_long_data () sicher, dass der Blob nicht vorhanden ist   größer als MySQLs max_allowed_packet

    
Ryan Manes 03.05.2015 21:12
quelle

Tags und Links