【问题标题】:What is wrong with my code, mysql, PDO prepare delete statement?我的代码、mysql、PDO 准备删除语句有什么问题?
【发布时间】:2015-02-19 05:57:31
【问题描述】:

为什么我的代码不起作用。救命啊,没看出有什么不对。如果我使用 user_id=$current_user 而不是 user_id=:current_id,它可以工作。但出于安全原因,我需要做好准备。请帮忙。

<?php
$hostname = 'localhost';
$username = '**';
$password = '**';
$dbname = '**';
try {
    $db = new PDO("mysql:host=$hostname;dbname=$dbname", "$username" ,"$password" , 
        array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

} catch (PDOException $e) {
    echo" There was an error with the connection";
}

$current_user=$_POST['users_id'];//get user id

include 'db_tag.php';
$stmt=$db->prepare("DELETE FROM object_sign WHERE user_id=:current_id");

$stmt->bindParam(":current_id",$current_user,PDO::PARAM_INT);
$stmt->execute(); 

?>

【问题讨论】:

  • 你得到什么错误?
  • 在萤火虫中,它说 NetworkError: 500 Internal Server Error
  • 签入响应/预览错误
  • 尝试从 PDO 构造函数中删除PDO::ATTR_EMULATE_PREPARES =&gt; false
  • @conan,您可以查看我的回答并告诉我您的反馈,以便我帮助您解决问题。

标签: php mysql pdo prepared-statement


【解决方案1】:

@conan,使用我提到的以下代码,您需要使用此代码检查以下几点。

1) 打印 $current_user id 以确保 id 是否正确显示,另外我设置了条件,如果帖子包含用户 id 则只执行查询。

2)我已经放了异常,所以你可以通过异常消息检查错误。

<?php
include 'db_tag.php';

$hostname = 'localhost';
$username = '**';
$password = '**';
$dbname = '**';

try {
     $db = new PDO("mysql:host=$hostname;dbname=$dbname", "$username" ,"$password" , 
        array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

    if(isset($_POST['users_id'])) {
        $current_user=$_POST['users_id'];//get user id

        $stmt=$db->prepare("DELETE FROM object_sign WHERE user_id=:user_id");

        $stmt->bindParam(":user_id",$current_user);
        $stmt->execute(); 
    } 
} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>

【讨论】:

  • 使用您的异常消息后,错误:SQLSTATE[HY093]: Invalid parameter number: parameter was not defined, but $current_user=$_POST['users_id'];没问题,我测试echo $current_user,很好。那么为什么在我的情况下没有定义参数。嗯,我的表包含多个相同的 user_id,这会导致问题吗?但是如果我使用user_id=$current_user,我删除也没问题。那么,就我而言,我做错了什么?
  • @conan,我已经编辑了我的答案并更改了参数,所以请现在再次检查上面的代码,如果还有任何问题,请告诉我。
  • 非常感谢!这是名字,名字必须匹配。 user_id 必须匹配:user_id
【解决方案2】:

$current_user 是整数还是字符串。如果字符串尝试 PDO::PARAM_STR 而不是 PDO::PARAM_INT

$stmt->bindParam(":current_id",$current_user,PDO::PARAM_STR);
$stmt->execute();

如果还是不行试试这个

//$stmt->bindParam(":current_id",$current_user,PDO::PARAM_STR);
$stmt->execute(array(:current_id"=>$current_user));

【讨论】:

  • 非常感谢!你的第二种方法也有效。您的第一种方式,PHP Weblineindia 找出问题所在,我需要的名称与我需要绑定的名称相匹配。所以 user_id 必须匹配:user_id,不能是:current_id,谢谢您的时间。
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2011-06-21
相关资源
最近更新 更多