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 冲突

错误:php55w-common 与 CentOS 6.5 上的 php-common 冲突

php+mysql链接很慢,无响应

处理Gradle依赖冲突

svn 更新代码冲突 怎么编辑冲突代码 解决