我刚刚学习了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;
答案 0 :(得分:1)
首先,这是使用准备好的查询的错误方法:
$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注入攻击开放。将您的查询更改为:
$sql= 'SELECT * FROM people_bios WHERE Gender = :Gender';
这样,当您绑定参数时,实际上会将其绑定到。
现在,回到你关于这条线的原始问题:
mysql_query($query) or die(mysql_error());
如果运行查询时出错,mysql_query()
的结果将是假的(或者是假的?我不记得了)。这就是or die(mysql_error())
进来的地方。如果mysql_query()
的结果为真,则该行的一半将不会执行。因此,如果发生错误,die()
(暂停所有内容)并显示从mysql_error()
返回的字符串,这是MySQL客户端遇到的最后一个错误。
PDO让事情变得更有帮助。您已经为PDO启用了例外,因此您可以使用try
/ catch
块:
try {
$stmt->execute();
} catch (Exception $e) {
print_r($e); // Do something more useful here, like log.
}
请注意,应避免按原样显示数据库错误。最好的情况是,它们可以提供对数据库后端的深入了解,并且可以显示更糟糕的重要数据,如凭据。处理错误并向用户显示更通用的消息。记录完整的异常!