2017-08-24 84 views
1

我有這樣的代碼,不想工作,我不明白爲什麼...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://stackoverflow.com/q/36628418/1011527)***或使用其他任何清理機制。這樣做*更改密碼並導致不必要的附加編碼。 –

+0

你首先綁定,然後再次使用相同的參數執行? – Qirel

+0

您可以綁定參數或執行數組,而不是兩者。 –

回答

2

您正在綁定變量兩次。您需要將變量綁定一次,可以是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

0

你是在你需要在$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 –

0

您的刪除語法不規範,應該是delete from tableName ...

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