首页 > 解决方案 > 为选择查询准备的语句苦苦挣扎

问题描述

在响应 Ajax 请求的 php 文件中,我尝试使用准备好的语句而不是这样做(实际工作):

<?php
$q = intval($_GET['q']);

$con = mysqli_connect('localhost','root','root','pokemons');
if (!$con) {
    die('Could not connect: ' . mysqli_error($con));
}

$sql="SELECT * FROM pokemons_en WHERE id = '".$q."'";
$result = mysqli_query($con,$sql);

while($row = mysqli_fetch_array($result)) {
    
    $separator = '|';
        
    echo '<img src="'. $row['image'] .'" unselectable="on"/>' . $separator . $row['name'] . $separator.  $row['type'] . $separator . $row['categorie'] . $separator. $row['talent']. $separator. $row['taille']. $separator. $row['poids']. $separator . '<audio id="audio" src="'. $row['audio'] .'" ></audio>'. $separator . $row['type2']. $separator . $row['bio'] ;

}

mysqli_close($con);
?>

这是从 mySQL 数据库输出数据的文件,它实际上正在工作。但据我了解,出于性能原因以及防止 SQL 注入攻击,我真的应该使用准备好的语句。

我尝试了这个和我能找到的许多其他方法,但我无法让它工作。我应该更正/修改哪一部分?

<?php
$q = intval($_GET['q']);

$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "pokemons";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT * FROM pokemons_en WHERE id = '".$q."'"); 
    $stmt->execute();

    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
    while($row = $stmt->fetchAll()) { 
        
        $separator = '|';
        
    echo '<img src="'. $row['image'] .'" unselectable="on"/>' . $separator . $row['name'] . $separator.  $row['type'] . $separator . $row['categorie'] . $separator. $row['talent']. $separator. $row['taille']. $separator. $row['poids']. $separator . '<audio id="audio" src="'. $row['audio'] .'" ></audio>'. $separator . $row['type2']. $separator . $row['bio'] ;
    }
}
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;
?>

标签: phpprepared-statement

解决方案


变量不会出现在准备好的语句中。尝试:

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM pokemons_en WHERE id = ?"); 
$stmt->execute(array($q));

?是一个占位符,驱动程序将对其进行转义并根据需要引用它。将execute值绑定到查询中。


推荐阅读