2017-08-29 100 views
1

我沒有這個代碼出現問題,將會令人驚訝的正常工作,但我真不明白它是如何工作的,甚至是它的權利,所以:從mysqli的更改爲PDO

我與mysqli的查詢阿賈克斯後或者獲得電話都是這樣的:

$con = mysqli_connect('localhost','root','','db') or die(header('Location: ./404.php')); 
$add = "INSERT INTO table (id, id2, id3) VALUES('','$fid','')"; 
      if(mysqli_query($con, $add)){ 
       echo "added"; 
       } 
$remove = "DELETE FROM table WHERE id2='$fid'"; 
      if(mysqli_query($con, $remove)){ 
       echo "removed"; 
      } 
$getInfo = "SELECT * FROM table"; 
      $result = $con->query($getInfo); 
      if($result->num_rows > 0) { 
       while($row = $result->fetch_assoc()){ 
        //do something 
       } 
      } 

併爲$_POST or $_GET values I used mysqli_real_escape_string

這裏被轉化爲PDO:

try{ 
$con = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 

$get = $con->query("SELECT * FROM table"); 
    foreach($get->fetchAll(PDO::FETCH_ASSOC) as $row){ 
        $data['0'] = $row['name']; 
        $data['1'] = $row['email']; 
        return $data; 
       } 

$add = $con->prepare("INSERT INTO table (id, id2, id3) VALUES(:f1,:f2,:f3)"); 
      $add->execute(array(':f1' => '', ':f2' => $fid, ':f3' => '')); 
      echo "added"; 

$remove = $con->prepare("DELETE FROM table WHERE id2=:f1"); 
      $remove->bindValue(':f1', $fid, PDO::PARAM_STR); 
      $remove->execute(); 
       echo "removed"; 

}catch(PDOException $ex){ 
    echo "error"; 
} 

現在這個工程,但我真的不知道它是否正確寫入pdo,我不需要使用像mysqli或類似的東西mysqli_real_escape_string的東西。 和所有我能找到的網頁是,它現在是如何寫的什麼部分代碼是幹什麼例如,當我在mysqli的插入,更新使用或刪除我用什麼

if(mysqli_query($con, $sql)){echo "success";}else echo 'fail'; 

我怎樣才能做到這一點與PDO ? 也爲使用嘗試和捕獲我不知道我需要使用它的每個查詢或我上面添加?

只是再說我是新來的PDO,我不明白它非常好,從上面的作品這個代碼,但我不知道是它寫的正確方法?

+0

在這裏你去我的朋友:https://phpdelusions.net/pdo – gview

+0

@gview謝謝你,有人下面投票答案下面沒有解釋,你可能會給一個爲什麼他的答案是錯的? –

+0

爲您提供了詳細的答案,希望它有幫助。此外,我非常懷疑你的手柄是否準確 - 你顯然不是一個愚蠢的孩子;) – gview

回答

0

首先,讓我祝賀你與PDO一起去。我知道所有經驗豐富的PHP開發人員中,他們幾乎一致認爲他們更喜歡PDO到mysqli。

我強烈建議你read through this guide使用PDO。它應該回答你所有的問題,甚至回答你將來可能會有的一些問題。

爲了您的具體問題:

不,你不因爲你是使用預處理語句使用佔位符不需要再逃避什麼,這麼久。轉義存在的原因正是因爲人們將變量插入到SQL語句中,並且可能會混淆需要包含字符串的引號。

隨着這個問題已經不存在準備好的語句,這也意味着,不再有SQL注入的危險。 SQL注入利用字符串連接將原始SQL語句轉換爲完全不同的語句,再次使用引號,這就是爲什麼從用戶輸入接受的非轉義字符串是SQL注入的攻擊媒介。這兩個問題都是使用參數和預準備語句解決的

至於PDO的錯誤處理,你想利用PDO::ERRMODE_EXCEPTION這是討論in the manual here

不幸的是,PDO默認爲PDO::ERRMODE_SILENT基本上忽略數據庫錯誤,只是設置你就必須檢查自己PDO對象變量。

雖這麼說,你可以在創建PDO連接對象或只是事後添加的錯誤方式解決這個問題。示例位於鏈接的PDO錯誤模式頁面上。

至於的try-catch塊,一般的例外是不是你想要的,除非你有一些功能代碼來解決該錯誤專門捕獲的東西。包裝每個SQL調用,以便您可以報告錯誤消息是壞的,無論是從DRY的角度來看,還是一個反模式。在適當的錯誤模式下,SQL錯誤會拋出異常,您可以在錯誤處理程序中處理異常,並且通常情況下,您不應該繼續使用這些異常。

您的錯誤處理程序應該(在生產中)將錯誤記錄到磁盤/向系統管理員或網站所有者發送電子郵件,並顯示專業外觀的非特定錯誤消息,通知用戶該問題以及應該發生的所有異常。