php - 为选择查询准备的语句苦苦挣扎
问题描述
在响应 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;
?>
解决方案
变量不会出现在准备好的语句中。尝试:
$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
值绑定到查询中。
推荐阅读
- powershell - 如何提取句点、星号和单词之间的字符串
- python - 如何使用网络抓取或 IMDbPY 来获取演员 Instagram 帐户的链接?
- java - 为什么签名指定接口时调用超类方法?
- json - 打印对象中不同条目的键和值
- google-chrome - 如何使用 Chrome DevTools 协议访问 XHR 请求?
- laravel - 普通 Web 和 API 中间件的 Laravel Echo 身份验证
- plot - 牛虻中的水平线
- sql - 部分更新:查询然后更新 SQL 中的一行以确保只更新修改后的值
- github - 如何隐藏一些代码部分并在机器中完整运行
- c++ - MySQL 连接器/C++ 8 X 插件已禁用