将php脚本更改为PDO导致MySQL更新查询期间出现语法错误


Changing php script to PDO causing Syntax error during MySQL update query

我有一个php脚本来更新MySQL表中的详细信息。一切都很好,但现在我已经将数据库连接方法更改为PDO:

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

为了适应这种情况,我对脚本进行了各种更改,以便它继续工作。唯一失败的地方是在mysql表更新后的末尾。我得到这个错误:

致命错误:未捕获异常"PDOException",消息为"SQLSTATE[42000]":语法错误或访问冲突:1064您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解在/home3/danville/public_html/test2/index.php:29堆栈跟踪:#0/home3/dan ville/ppublic_html/ttest2/index.php(29):PDO->查询('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);
        }

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

你知道我想改变什么来阻止这个错误吗?其他详细信息-我使用require_one include连接到数据库。尽管出现错误,更新仍会生效。

如果要切换到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);