2013-12-23 121 views
-3

我正在重建我的當前腳本以支持PDO而不是MySQL查詢。我被困在這個插入查詢,但它不執行,我不知道爲什麼。PDO插入查詢不起作用

Google'd有點但找不到任何東西。

   try 
       { 
        $sql = "INSERT INTO 
           news (news_name, 
            news_description, 
            news_author, 
            news_date, 
            news_link, 
            news_category) 
          VALUES ('" . trim($_POST['news_name']) . "', 
           '" . trim($_POST['news_description']) . "', 
           " . $_SESSION['admin_id'] . ", 
           NOW(), 
           '" . trim($_POST['news_link']) . "', 
           '" . trim($_POST['news_category']) . "' 
           )"; 
        $results = $db->exec($sql); 
        $id = $db->lastInsertId(); 

        if($results) 
        { 
         echo $id; 
         echo '<p>News item added succesfully</p>'; 
         echo '<a href="admin.php">Click here to return to the admin panel</a>';      
        } 
       } 
       catch(PDOException $e) 
       { 
        echo $e->getMessage(); 
       } 
      } 
      ?> 
+0

不要將值連接到查詢中。閱讀doco和['PDO :: prepare'](http://php.net/manual/pdo.prepare.php),['PDOStatement :: bindParam'](http://php.net/manual /pdostatement.bindparam.php)/ ['PDOStatement :: bindValue'](http://php.net/manual/pdostatement.bindvalue.php)和['PDOStatement :: execute'](http://php.net /manual/pdostatement.execute.php) – Phil

+0

此外,如果您希望它拋出異常,則需要將PDO :: ATTR_ERRMODE屬性設置爲「PDO :: ERRMODE_EXCEPTION」。參見['PDO :: setAttribute'](http://php.net/manual/pdo.setattribute.php) – Phil

回答

1

首先,設置PDO如果你還沒有在遇到錯誤時拋出異常......

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

現在,準備INSERT語句的參數

$sql = <<<_SQL 
INSERT INTO `news` (news_name, news_description, news_author, 
        news_date, news_link, news_category) 
VALUES (:name, :description, :author_id, NOW(), :link, :category) 
_SQL; 
$stmt = $db->prepare($sql); 

然後用你的值執行它

$stmt->execute([ // PHP 5.4 short array syntax, use array(...) if not available 
    ':name'  => trim($_POST['news_name']), 
    ':description' => trim($_POST['news_description']), 
    ':author_id' => $_SESSION['admin_id'], 
    ':link'  => trim($_POST['news_link']), 
    ':category' => trim($_POST['news_category']) 
]); 

最後...

catch(PDOException $e) 
{ 
    echo $e->getMessage();   
} 

不要這樣做。它不僅向最終用戶公開內部信息,而且可以讓程序繼續運行,就好像什麼都沒有發生過一樣。

開發時,讓異常處理未處理,從而終止執行。在生產中,實現一個高級異常處理程序,可以在向用戶提供友好的錯誤消息時記錄和/或通知您問題。