用于PDO的AJAX升级($ qry_result)

时间:2014-01-19 17:17:26

标签: php mysql

我刚刚学习了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;

1 个答案:

答案 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.
}

请注意,应避免按原样显示数据库错误。最好的情况是,它们可以提供对数据库后端的深入了解,并且可以显示更糟糕的重要数据,如凭据。处理错误并向用户显示更通用的消息。记录完整的异常!