AJAX/PDO 冲突 (PHP/MySQL)
Posted
技术标签:
【中文标题】AJAX/PDO 冲突 (PHP/MySQL)【英文标题】:AJAX/PDO Conflict (PHP/MySQL) 【发布时间】:2014-02-09 07:00:02 【问题描述】:几天前,我从一个教程中获得了我的第一个工作 AJAX 脚本。唯一的问题是它是用“老式”数据库查询编写的。我必须升级代码以使其与 PDO 兼容 - 但我没有完成这项工作。
它在一定程度上起作用;我可以显示基于性别的人员列表。但是,当我尝试按年龄或 wpm 优化列表时,它不起作用。
这是原始查询:
$query = "SELECT * FROM ajax_example WHERE sex = '$sex'";
所以显而易见的问题是我的代码中留下的三个 $query 变量:
$query .= " AND age <= $age";
$query .= " AND wpm <= $wpm";
echo "Query: " . $query . "<br />";
我用 $stmt 替换了 $query 的每个实例,但它不起作用。所以我用 $row、$sql 甚至 $Total 替换了它们,但没有任何效果。在大多数情况下,它仍然有效——我可以根据性别在表格中显示每个名字。但是当我输入年龄或 wpm 的值时,它不起作用(并且某些变量会产生错误消息)。
谁能告诉我用什么替换 $query ?
$age = $_GET['age'];
$sex = $_GET['sex'];
$wpm = $_GET['wpm'];
//build query
$sql= "SELECT * FROM ajax_example WHERE sex = :sex";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':sex',$sex,PDO::PARAM_STR);
$stmt->execute();
$Total = $stmt->fetch();
if(is_numeric($age))
$query .= " AND age <= $age";
if(is_numeric($wpm))
$query .= " AND wpm <= $wpm";
//Execute query
try
$stmt->execute();
catch (Exception $e)
// print_r($e); // Do something more useful here, like log.
//Build Result String
$display_string = "<table>";
$display_string .= "<tr>";
$display_string .= "<th>Name</th>";
$display_string .= "<th>Age</th>";
$display_string .= "<th>Sex</th>";
$display_string .= "<th>WPM</th>";
$display_string .= "</tr>";
// Insert a new row in the table for each person returned
while ($row = $stmt->fetch())
$display_string .= "<tr>";
$display_string .= "<td>$row[name]</td>";
$display_string .= "<td>$row[age]</td>";
$display_string .= "<td>$row[sex]</td>";
$display_string .= "<td>$row[wpm]</td>";
$display_string .= "</tr>";
echo "Query: " . $query . "<br />";
$display_string .= "</table>";
echo $display_string;
【问题讨论】:
【参考方案1】:您必须先在$sql
中构建整个查询字符串,然后再进行准备、绑定参数和执行。
//build query
$sql= "SELECT * FROM ajax_example WHERE sex = :sex";
if(is_numeric($age))
$sql .= " AND age <= :age";
if(is_numeric($wpm))
$sql .= " AND wpm <= :wpm";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':sex',$sex,PDO::PARAM_STR);
if (is_numeric($age))
$stmt->bindParam(':age', $age, PDO::PARAM_INT);
if(is_numeric($wpm))
$stmt->bindParam(':wpm', $wpm, PDO::PARAM_INT);
$stmt->execute();
//Execute query
try
$stmt->execute();
catch (Exception $e)
// print_r($e); // Do something more useful here, like log.
【讨论】:
哇,我还有很多东西要学;我认为 bindParam 的东西以查询结束! 不确定你的意思。它确实必须在执行查询之前完成。 bindParam 的东西不是将变量直接替换到查询字符串中。【参考方案2】:在 PDO 中使用未命名参数进行动态查询并在 execute() 中将它们作为数组传递会更容易。除非至少传递$_GET['sex']
参数,否则不会执行该语句。我留在了派生语句的回声和数组的转储中。
$age = isset($_GET['age']) ? $_GET['age'] : NULL;
$wpm = isset($_GET['wpm']) ? $_GET['wpm'] : NULL;
if(isset($_GET['sex']))
$params =array($_GET['sex']);
//build query
$sql= "SELECT * FROM xajax_example WHERE sex = ?";
if(is_numeric($age))
$sql .= " AND age ?";
array_push($params,$age);
if(is_numeric($wpm))
$sql .= " AND wpm ?";
array_push($params,$wpm);
echo $sql;//Test
print_r($params);//Test
$stmt = $dbh->prepare($sql);
$stmt->execute($params);
else
echo "No Sex";//Default message for no $_GET['sex']
【讨论】:
以上是关于AJAX/PDO 冲突 (PHP/MySQL)的主要内容,如果未能解决你的问题,请参考以下文章
PHP:如何访问 phpMyAdmin / php.ini 和 extension_dir 之间的奇怪冲突
错误:php55w-common 与 CentOS 6.5 上的 php-common 冲突