Heim >Backend-Entwicklung >PHP-Tutorial >Vorverarbeitung von MySQL in PHP Prepare

Vorverarbeitung von MySQL in PHP Prepare

不言
不言Original
2018-07-04 17:46:572671Durchsuche

Dieser Artikel stellt hauptsächlich die Vorverarbeitung für den Betrieb von MySQL vor. Er hat einen bestimmten Referenzwert. Jetzt kann ich ihn mit Ihnen teilen.

Der Betrieb von MySQL in PHP Vorverarbeitung vorbereiten

1. [PHP-Fehler] Parameter 2 kann nicht als Referenz übergeben werden

Dieser Fehler bedeutet, dass der zweite Parameter nicht als Referenz übergeben werden kann
Der Grund für diesen Fehler ist bind_param Außer Der erste Parameter, der den Datentyp darstellt,
in der ()-Methode erfordert Variablen anstelle von direkten Mengen, da andere Parameter als Referenz übergeben werden

$sql = "select * from tmp where myname=? or sex =?";
$stmt = $mysqli->conn->prepare($sql);
$name ="a";
$sex="b";
$stmt->bind_param('ss',$name,$sex);//必须要这样传参,且在mysqli等的预处理参数绑定中,必须要指定参数的类型且只能一次性绑定全部参数,不能像PDO那样一个个绑定

//$stmt->bind_param('ss',"a","b");
//这种方式的会报错:Fatal error: Cannot pass parameter 2 by reference$stmt->execute();
if($mysqli->conn->affected_rows){    
$result = $stmt->get_result();    
while($row = $result->fetch_assoc()){        
var_dump($row);
    }
}

2 , PHP verhindert SQL-Injection, nicht Verwenden Sie nicht mehr addslashes und mysql_real_escape_string

Unabhängig davon, ob Sie addslashes oder mysql_real_escape_string verwenden, können Sie Codierungsschwachstellen nutzen, um sich beim Server anzumelden, indem Sie ein beliebiges Passwort eingeben. ! ! ! (Ich werde nicht näher auf das Prinzip des Angriffs eingehen. Interessierte Schüler können sich mit den Einzelbyte- und Mehrbyte-Problemen bei der Zeichenkodierung befassen.)

🎜>Der Grund, warum mysql_real_escape_string die Injektion verhindern kann, liegt darin, dass mysql_escape_string selbst die aktuelle Codierung nicht bestimmen kann. Durch Hinzufügen können Sie die Injektion von Codierungsproblemen verhindern. Obwohl SQL-Injection bis zu einem gewissen Grad verhindert werden kann, wird die folgende perfekte Lösung dennoch empfohlen.

Die perfekte Lösung ist die Verwendung von PDO und MYSQLi mit Prepared Statement-Mechanismus anstelle von mysql_query (Hinweis: mysql_query ist seit PHP 5.5.0 veraltet und wird in Zukunft entfernt):

PDO :

    $pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
     
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    $stmt->execute(array('name' => $name));
     
    foreach ($stmt as $row) {
    // do something with $row

MYSQLI:

    $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
    $stmt->bind_param('s', $name);
     
    $stmt->execute();
     
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
    // do something with $row
    }

PDO:

$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');


$stmt->execute(array('name' => $name));

 


foreach ($stmt as $row) {


// do something with $row


}

MYSQLi:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
 
$stmt->execute();
 
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}

Die Bedeutung dieses Fehlers ist, dass das Byte nicht sein kann Als Referenz übergeben Der Grund, warum dieser Fehler für die beiden Parameter

auftritt, liegt darin, dass mit Ausnahme des ersten Parameters, der den Datentyp in der bind_param()-Methode darstellt, alle
aufgrund anderer Parameter Variablen anstelle direkter Mengen verwenden müssen sind durch Verweis bestanden. Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Wie PHP bestimmt, ob ein Link gültig ist


Interaktion zwischen PHP und Webseiten

Das obige ist der detaillierte Inhalt vonVorverarbeitung von MySQL in PHP Prepare. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn