gpt4 book ai didi

php - PDO 的 AJAX 升级 ($qry_result)

转载 作者:行者123 更新时间:2023-11-29 13:18:03 25 4
gpt4 key购买 nike

我最近刚刚学习了 PDO 查询的基础知识,现在我正在处理 AJAX。我有一个来自教程的有效 AJAX 脚本,但它是用“老式”数据库查询而不是 PDO 编写的。

我一直在尝试修改它,但还没有成功。我想我已经修复了这一行的所有内容,但我不明白:

$qry_result = mysql_query($query) or die(mysql_error());

如何修改该行?

这是原始查询:

$query = "SELECT * FROM people_bios WHERE Gender = '$Gender'";

我粘贴了下面的整个脚本 - 不是原始脚本,而是我的升级版本。

$dsn = "mysql:host=localhost;dbname=db_new;charset=utf8";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);

$pdo = new PDO($dsn,'UserMe','aBCs804hG24LME', $opt);

// Retrieve data from Query String
$age = $_GET['age'];
$Gender = $_GET['Gender'];
$wpm = $_GET['wpm'];
// Escape User Input to help prevent SQL Injection
// NOTE: Since I've converted this to PDO, I assume I can delete the next three lines:
// $age = mysql_real_escape_string($age);
// $Gender = mysql_real_escape_string($Gender);
// $wpm = mysql_real_escape_string($wpm);

$sql= "SELECT * FROM people_bios WHERE Gender = '$Gender'";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':Gender',$Gender,PDO::PARAM_STR);
$stmt->execute();
$Total = $stmt->fetch();

if(is_numeric($age))
$query .= " AND age <= $age";
if(is_numeric($wpm))
$query .= " AND wpm <= $wpm";

$qry_result = mysql_query($query) or die(mysql_error());

//Build Result String
$display_string = "<table>";
$display_string .= "<tr>";
$display_string .= "<th>Name</th>";
$display_string .= "<th>Age</th>";
$display_string .= "<th>Gender</th>";
$display_string .= "<th>WPM</th>";
$display_string .= "</tr>";

// Insert a new row in the table for each person returned
while ($row = $stm->fetch())
{
$display_string .= "<tr>";
$display_string .= "<td>$row[Common]</td>";
$display_string .= "<td>$row[age]</td>";
$display_string .= "<td>$row[Gender]</td>";
$display_string .= "<td>$row[wpm]</td>";
$display_string .= "</tr>";

}
echo "Query: " . $query . "<br />";
$display_string .= "</table>";
echo $display_string;

最佳答案

首先,这是使用准备好的查询的错误方法:

$sql= "SELECT * FROM people_bios WHERE Gender = '$Gender'";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':Gender',$Gender,PDO::PARAM_STR);
$stmt->execute();
$Total = $stmt->fetch();

在查询行中,您仍在连接值,并且仍然容易受到 SQL 注入(inject)攻击。将您的查询更改为:

$sql= 'SELECT * FROM people_bios WHERE Gender = :Gender';

这样,当您绑定(bind)参数时,就可以实际将其绑定(bind)到某个东西。

现在,回到您最初的问题,即该行的作用:

mysql_query($query) or die(mysql_error());

如果运行查询时出现错误,mysql_query() 的结果将为 false(或假?我不记得了)。这就是 or die(mysql_error()) 的用武之地。如果 mysql_query() 的结果为 true,则这半行将不会执行。因此,如果发生错误,die()(停止一切)并显示从 mysql_error() 返回的字符串,这是 MySQL 客户端遇到的最后一个错误。

PDO 让事情变得更有帮助。您已经启用了 PDO 异常,因此可以使用 try/catch block :

try {
$stmt->execute();
} catch (Exception $e) {
print_r($e); // Do something more useful here, like log.
}

请注意,您应该避免按原样显示数据库错误。最好的情况是,它们可以提供对数据库后端的一些洞察,最糟糕的是,可能会泄露凭据等重要数据。处理错误并向用户显示更通用的消息。不过记录完整的异常!

关于php - PDO 的 AJAX 升级 ($qry_result),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21219951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com