2

我有一个 php 脚本来更新 MySQL 表中的详细信息。一切正常,但现在我已将 db 连接方法更改为 PDO:

$pdo = new PDO('mysql:host=localhost;dbname=****', '****', '*****');

我对脚本进行了各种更改以适应这一点,因此它继续工作,唯一失败的地方是在 mysql 表更新后的最后。我收到此错误:

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 /home3/danville/public_html/test2/index.php:29 中的第 1 行的“和 park_id=31”附近使用正确的语法 堆栈跟踪:#0 /home3/ danville/public_html/test2/index.php(29): PDO->query('update tpf_ride...') #1 {main} 在第 29 行的 /home3/danville/public_html/test2/index.php 中抛出

这是导致错误的一段代码:

$query = "update tpf_rides set name='$name',type='$type'";
        if($topride!=""){$query .= ",top_ride=$topride";}
        if($info!=""){$query .= ",info='$info'";}
        if($height!=""){$query .= ",height=$height";}
        if($length!=""){$query .= ",length=$length";}
        if($speed!=""){$query .= ",speed=$speed";}
        if($inversions!=""){$query .= ",inversions=$inversions";}
    $query .= " where ride_id=".$ride_id." and park_id=".$park_id;  
            $pdo->query($query);
        }

第 29 行是 Notepad++ 上$pdo->query($query);的,尽管错误消息似乎引用了上面的行$query .= " where ride_id=".$ride_id." and park_id=".$park_id;

有什么想法我需要改变以阻止错误吗?其他详细信息 - 我使用 require_once 包含连接到数据库。尽管出现错误,更新仍会生效。

4

1 回答 1

2

如果要切换到 PDO,不妨利用准备好的语句和参数绑定。它实际上使您的查询免受SQL 注入的影响,也使您的代码更具可读性。您的查询构建器方法确实使事情变得有些复杂,但它仍然是可能的。我还强烈建议在开发过程中启用错误报告。例如

error_reporting(E_ALL);
ini_set('display_errors', 'On');

$upd = array('name = :name', 'type = :type');
$values = array(
    'name' => $name,
    'type' => $type,
    'ride_id' => $ride_id,
    'park_id' => $park_id
);

if (!empty($topride)) {
    $upd[] = 'top_ride = :topride'; // :topride is the named parameter placeholder
    $values['topride'] = $topride; // the array key matches the named placeholder above
}
if (!empty($info)) {
    $upd[] = 'info = :info';
    $values['info'] = $info;
}
// and so on

$query = sprintf('UPDATE tpf_rides SET %s WHERE ride_id = :ride_id AND park_id = :park_id',
    implode(', ', $upd));
$stmt = $pdo->prepare($query);
$stmt->execute($values);
于 2013-08-12T00:41:12.853 回答