Der zweite Parameter von MySQLI_STMT :: BIND_PARAM wird verwendet, um den Typ der Bindungsvariablen anzugeben, die die folgenden Zeichen sein können:
I : Ganzzahl
D : doppelte Präzision schwimmend (doppelt)
S : String (String)
B : Binärdaten (Blob)
Einer der häufigsten Typ -Konvertierungsfehler ist, dass der an Bind_Param übergebene variable Typ mit dem erwarteten Typ nicht übereinstimmt. Wenn Sie beispielsweise eine Ganzzahl ( i ) in einer SQL -Anweisung erwarten, aber tatsächlich eine Variable des String -Typs übergeben, konvertiert MySQL die Zeichenfolge in 0 oder ein Fehler tritt auf.
Fehlerbeispiel :
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE age = ?"</span></span><span>);
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-string">"25"</span></span><span>; </span><span><span class="hljs-comment">// String -Typ</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>); </span><span><span class="hljs-comment">// Bindungstypfehler,Es sollte eine Ganzzahl sein(i)</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span> Lösung :
Stellen Sie sicher, dass der gebundene variable Typ mit dem erwarteten Typ der SQL -Abfrageanweisung übereinstimmt. Wenn die variablen Typen nicht übereinstimmen, können Sie zuerst die Typumwandlung durchführen und dann binden.
<span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>; </span><span><span class="hljs-comment">// Stellen Sie sicher, dass es sich um einen Ganzzahltyp handelt</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>); </span><span><span class="hljs-comment">// Bindungsbezahlung</span></span><span>
</span></span>Die Funktion mySQLI_STMT :: BIND_PARAM ist bei der Verarbeitung von Nullwerten von Bedeutung. Null in PHP muss explizit gebunden werden und kann nicht direkt an Bind_param übergeben werden. Andernfalls verursacht es Ausführungsfehler oder falsches Verhalten.
Fehlerbeispiel :
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (name, age) VALUES (?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>; </span><span><span class="hljs-comment">// nullWert</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>); </span><span><span class="hljs-comment">// Fehler,Kann nicht direkt bindenNULL</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span> Lösung :
Beim Bindung von Nullwerten unterstützt Bind_param keine direkte Bindung von NULL , daher muss es in das entsprechende Format konvertiert werden oder eine andere Version von Bind_param verwenden. Die häufigste Methode ist die Verwendung von MySQLI_STMT :: SEND_LONG_DATA , aber dies ist mehr umständlich, um Nullwerte zu verarbeiten.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$age</span></span><span> === </span><span><span class="hljs-literal">null</span></span><span>) {
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// 或者根据实际需求设置一个默认Wert</span></span><span>
}
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>); </span><span><span class="hljs-comment">// Binden默认Wert</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>Manchmal begegnen wir, wie wir Zahlen als Saiten oder umgekehrt begegnen. Während MySQL in einigen Fällen automatisch Typkonvertierungen durchführt, kann dies dennoch zu Leistungsproblemen oder unvorhersehbarem Verhalten führen.
Fehlerbeispiel :
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM products WHERE price = ?"</span></span><span>);
</span><span><span class="hljs-variable">$price</span></span><span> = </span><span><span class="hljs-number">199.99</span></span><span>; </span><span><span class="hljs-comment">// 价格是浮动数Wert</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$price</span></span><span>); </span><span><span class="hljs-comment">// Fehler,Sollte verwendet werdend(double)Typ</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span> Lösung :
Wenn Sie einen schwebenden Wert übergeben, verwenden Sie unbedingt den Typ D (doppelt) anstelle von S (String). Dies gewährleistet nicht nur den richtigen Datentyp -Pass, sondern verbessert auch die Effizienz der Abfrage.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"d"</span></span><span>, </span><span><span class="hljs-variable">$price</span></span><span>); </span><span><span class="hljs-comment">// Binden浮动数Wert</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>Bind_param unterstützt nur einfache Skalartypen (integraler, schwebender Wert, String, Binärdaten). Wenn ein Array oder Objekt übergeben wird, fällt Bind_param aus. Daher müssen die Daten vor dem Übergeben komplexer Datentypen vorverarbeitet werden.
Fehlerbeispiel :
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (preferences) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$preferences</span></span><span> = [</span><span><span class="hljs-string">"color"</span></span><span> => </span><span><span class="hljs-string">"blue"</span></span><span>, </span><span><span class="hljs-string">"size"</span></span><span> => </span><span><span class="hljs-string">"L"</span></span><span>]; </span><span><span class="hljs-comment">// 数组Typ</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$preferences</span></span><span>); </span><span><span class="hljs-comment">// Fehler,Arrays können nicht direkt gebunden werden</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span> Lösung :
Vor dem Übergeben eines Arrays oder Objekts ist es normalerweise erforderlich, es in eine JSON -Zeichenfolge oder ein anderes Format zu serialisieren.
<span><span><span class="hljs-variable">$preferences</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_encode</span></span><span>([</span><span><span class="hljs-string">"color"</span></span><span> => </span><span><span class="hljs-string">"blue"</span></span><span>, </span><span><span class="hljs-string">"size"</span></span><span> => </span><span><span class="hljs-string">"L"</span></span><span>]);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$preferences</span></span><span>); </span><span><span class="hljs-comment">// BindenJSONSaite</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>Ein Typ -Konvertierungsfehler wird ebenfalls erhöht, wenn die Grandzahl den maximalen Bereich des angegebenen Typs überschreitet. Für Ganzzahlen ( i ) liegt es normalerweise zwischen -2.2.147.483.648 bis 2.147.483.647 . Für schwimmende Werte ( d ) ist der Bereich viel größer, aber es gibt immer noch eine Obergrenze.
Fehlerbeispiel :
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO large_numbers (value) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-number">1000000000000</span></span><span>; </span><span><span class="hljs-comment">// Zu große Zahlen</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>); </span><span><span class="hljs-comment">// Fehler,Zahlen sind außerzahliger Bereiche</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span> Lösung :
Wenn sich die übergabe Nummer außerhalb des Ganzzahlbereichs befindet, können Sie den schwimmenden Typ ( d ) verwenden, um Überlauf zu vermeiden oder ihn in einen geeigneten Bereich umzuwandeln.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"d"</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>); </span><span><span class="hljs-comment">// 使用双精度浮动数Wert</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
Verwandte Tags:
mysqli_stmt