2011-09-15 62 views
0


我創建簡單的應用程序,使用PDO第一次,並堅持對 問題...
我搜索網頁的東西類比,但沒有找到它。
我無法在表格中插入數據。自動遞增值正在改變,所以 一些數據被髮送到表。
如果我使用變量中的值回顯查詢,請將其複製並粘貼到 phpmyadmin中,行插入正確。
日誌包含相同的查詢,MySQL和PHP不返回任何錯誤...

現在我有:

類文章:
問題的插入到MySQL表,由PHP PDO

class article{ 
    private function findMaxSortId($pdo_object){ 
     $query_sort=" 
        SELECT MAX(sort_id) as max_id 
        FROM articles"; 
     try{ 
      $pdo_object->prepare($query_sort); 
      $max_row=$pdo_object->query($query_sort)->fetch(PDO::FETCH_ASSOC); 
     } 
     catch(PDOException $eSortId){ 
      $return['error_code_sort']=$eSortId->errorCode(); 
      $return['error_info_sort']=$eSortId->errorInfo(); 
     } 
     $return['max_id']=$max_row['max_id']; 
     return $return; 
    }  
    public function createArticle($pdo_object, $title, $body, $visible, $incerase_sort_id=2){ 
     $return=$this->findMaxSortId($pdo_object); 
     $sort_id=$return['max_id']+$incerase_sort_id; 

     $pdo_object->exec(" 
      INSERT INTO `articles` (sort_id, visible, title, body) 
      VALUES ('".$sort_id."', '".$visible."', '".$title."', '".$body."') 
     "); 
     $return['id']=$pdo_object->lastInsertId(); 
     return $return; 
    } 
} 


的index.php:

if(isset($_POST['save'])&&$_POST['save']=='add'){ 
    if (isset($_POST['visible'])) { 
     $visible=1; 
    } 
    else{ 
     $visible=0; 
    } 
    require_once 'class/class.article.php'; 
    $art = new article(); 
    $art->createArticle($pdo, $_POST['title'], $_POST['body'], $visible); 
    unset($art); 
} 


文章表DB:

CREATE TABLE `articles` (
    `article_id` int(11) NOT NULL AUTO_INCREMENT, 
    `sort_id` int(11) DEFAULT NULL, 
    `lastmod` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `visible` tinyint(1) DEFAULT NULL, 
    `title` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `body` text COLLATE utf8_unicode_ci, 
    PRIMARY KEY (`article_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

     
我做錯了嗎?
請幫忙。


貌似問題比較複雜。
我無法執行任何使用PDO在數據庫中寫入內容的操作。
我可以查詢DB和「讀取」值,但是如果我使用INSERT或UPDATE,則什麼也沒有發生。
我在64位操作系統上使用WampServer 2.1。
我可以在沒有PDO的情況下執行此操作,使用mysql查詢,提取等操作。

回答

0

嘗試在處理值時用INSERT INTO替換反引號。

1

這是錯誤的:

$pdo_object->exec(" 
     INSERT INTO `articles` (sort_id, visible, title, body) 
     VALUES (`".$sort_id."`, `".$visible."`, `".$title."`, `".$body."`) 
    "); 

你應該用單或雙引號代替反引號:

$pdo_object->exec(" 
     INSERT INTO `articles` (sort_id, visible, title, body) 
     VALUES ('".$sort_id."', '".$visible."', '".$title."', '".$body."') 
    "); 

反引號將被用於表和字段名稱。

+0

@喬恩斯特林和sanmai你是對的,但是這是我的組合結果;)報價爲第一選擇,以這種形式我應該張貼的代碼,但我改變了很多次,只是忘了改回來 – tomiozo

+0

我只是將這些反引號改爲引號。只是爲了不誤導別人。 – tomiozo

3

您應該使用準備的語句,而不是那些瘋狂的查詢創建代碼。 喜歡的東西:

$stmt = $pdo_object->prepare('INSERT INTO `articles` (sort_id, visible, title, body) 
      VALUES (:id, :visible, :title, :body)'); 
$stmt->execute(array(':id' => $sort_id, 
        ':visible' => $visible, 
        ':title' => $title, 
        ':body' => $body)); 

這將防止討厭的SQL injection你不想要的。

要查看您可能遇到的SQL錯誤,請致電$pdo_object->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,以便在發生錯誤時引發異常。不要在生產環境中使用這種方式,因爲它會在異常消息中提供數據庫登錄名和密碼。

我還建議你在代碼的周圍使用transactions,這樣如果在同一時刻創建同一個sort_id,就不會有多篇文章。

public function createArticle($pdo_object, $title, $body, $visible, $incerase_sort_id=2){ 
    $pdo_object->beginTransaction(); 
    try{ 
    $return=$this->findMaxSortId($pdo_object); 
    $sort_id=$return['max_id']+$incerase_sort_id; 

    $stmt = $pdo_object->prepare('INSERT INTO `articles` (sort_id, visible, title, body) 
       VALUES (:id, :visible, :title, :body)'); 
    $stmt->execute(array(':id' => $sort_id, 
         ':visible' => $visible, 
         ':title' => $title, 
         ':body' => $body)); 
    $return['id']=$pdo_object->lastInsertId(); 
    }catch(Exception $e){ 
    $pdo_object->rollBack(); 
    return null; 
    } 
    $pdo_object->commit(); 
    return $return; 
} 
+0

我已經試過準備好的陳述,結果是一樣的。但我用問號試了一下。 我會檢查它並讓你知道。我也會檢查ERRMODE。 感謝您對交易的建議,我會在其他項目中使用它,但是由於我寫這個項目很簡單,因此會有10-15篇文章,所以我會認爲這將被整理一次,並且是所有的;) This will be網站,我把其他網站XML聯盟計劃規範(XML,實施等)。我會在6個月內修改一次。 – tomiozo