PDO删除查询不起作用

问题描述:

我有这样的代码,不想工作,我不明白为什么...PDO删除查询不起作用

$DeleteT=$con->prepare("DELETE Examples FROM USERS WHERE Email=:Email AND Pass=:Pass"); 
$DeleteT->bindParam(':Pass', $Pass); 
$DeleteT->bindParam(':Email', $Email); 
$DeleteT->execute(array(
     ':Email' => $Email, 
     ':Pass' => $Pass, 
)); 

我已经试图寻找例如删除查询的,但我仍然不明白为什么,我的价值不希望从数据库中删除,我也检查表的名称和数据库的名称是否匹配,他们这样做。

+0

**从来都不是平坦存储文本密码!**请使用*** PHP' s [内置函数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)***来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用'password_hash()'[兼容包](https://github.com/ircmaxell/password_compat)。 ***在散列之前,不需要[escape passwords](http://*.com/q/36628418/1011527)***或使用其他任何清理机制。这样做*更改密码并导致不必要的附加编码。 –

+0

你首先绑定,然后再次使用相同的参数执行? – Qirel

+0

您可以绑定参数或执行数组,而不是两者。 –

您正在绑定变量两次。您需要将变量绑定一次,可以是bindParam()或​​,但不能同时绑定两个变量。

此外,删除的语法是DETLETE FROM...,而不是DELETE column FROM...

所以它会无论是这个样子,结合他们通过​​

$DeleteT = $con->prepare("DELETE FROM USERS WHERE Email=:Email AND Pass=:Pass"); 
$DeleteT->execute(array(
    ':Email' => $Email, 
    ':Pass' => $Pass 
)); 

,或者,如果你想使用bindParam() ...

$DeleteT = $con->prepare("DELETE FROM USERS WHERE Email=:Email AND Pass=:Pass"); 
$DeleteT->bindParam(':Pass', $Pass); 
$DeleteT->bindParam(':Email', $Email); 
$DeleteT->execute(); 

无论是罚款为此,选择你最喜欢哪一个。 PDOStatement::bindParam()有额外的选项,如果你需要的话(下面链接documentation有更多的信息),但为了绑定两个字符串,任何一种方式都适用。


更新:
按照该意见,你希望只空出Examples列。这意味着你想要UPDATE这一行,而不是DELETE它。下面的例子将Example列设置为一个空字符串(假设它是一个text或varchar列,并接受字符串)。如果您希望将其设置为NULL或其他值,请对其进行修改。

$DeleteT = $con->prepare("UPDATE USERS SET Examples=:example WHERE Email=:Email AND Pass=:Pass"); 
$DeleteT->execute(array(
    ':example' => '', 
    ':Email' => $Email, 
    ':Pass' => $Pass 
)); 

安全注意
你应该NEVER存储密码以纯文本,或通过使用散列的差方法(如md5()sha1()等)。 这根本不安全! PHP有内置的函数,您应该使用它来处理密码的存储,请参阅password_hash()函数,它更加安全!

+0

我删除了bindParam,但它仍然不起作用,无论如何谢谢你,为你的时间! –

+0

然后你需要弄清楚是否有任何来自MySQL的错误。通过在创建PDO连接后添加'$ con> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'来设置PDO以引发错误的异常。然后检查您的日志(或者如果您尚未启用错误报告)。 – Qirel

+0

@ A.Rossi查询中还有一个语法错误,请参阅我的更新答案。 – Qirel

你是在你需要在$Delete结合的$DeleteT

,而不是错误的变量绑定这就是你需要

$DeleteT=$con->prepare("DELETE Examples FROM USERS WHERE Email=:Email AND Pass=:Pass")->execute(array(':Email' => $Email,':Pass' => $Pass)); 

PS:注意在':Pass' => $Pass,));额外,删除它。通过bindParam()一次,然后再次作为参数​​- 也没有明文存储密码,请使用password_hash()和password_verify()

+0

对不起,我错误地输入了代码,但它仍然不起作用。无论如何坦克你的答案! –

+0

然后写上正确的代码,否则我们不会解决问题@ A.Rossi –

您的删除语法不规范,应该是delete from tableName ...

$DeleteT=$con->prepare("DELETE FROM USERS WHERE Email=:Email AND Pass=:Pass"); 
    $DeleteT->execute(array(
     ':Email' => $Email, 
     ':Pass' => $Pass 
    ));