【问题标题】:AJAX/PDO Conflict (PHP/MySQL)AJAX/PDO 冲突 (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;

【问题讨论】:

    标签: php mysql sql ajax pdo


    【解决方案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']
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多