2013-01-04 83 views
2

我想用PDO插入到MySQL表中。 代碼:PDO插入成功但不是?

public function sendMail($to, $body) { 
    /* this all works 
    * 
    error_reporting(E_ALL); 
    ini_set('display_errors', '1'); 
    $stmt = $this->database->prepare("SELECT * FROM users"); 
    $stmt->execute(); 
    $fetch = $stmt->fetchAll(); 
    print_r($fetch); 
    */ 

    $stmt = $this->database->prepare("INSERT INTO 
     inbox_unread (date, body, to, from) VALUES (:date, :body, :to, :from)"); 
    echo $stmt->bindParam(":date", date("Y-m-d H:i:s")); 
    echo $stmt->bindParam(":body", $body); 
    echo $stmt->bindParam(":to", $to); 
    echo $stmt->bindParam(":from", $_SESSION['username']); 
    if ($stmt->execute()) { 
     echo "yes"; 
    } else { 
     print_r($this->database->errorInfo()); 
    } 
} 

這是輸出我得到:

1111Array ([0] => 00000 [1] => [2] =>) 

數據庫:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 

-- 
-- Database: `sandbox` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `inbox_unread` 
-- 

CREATE TABLE IF NOT EXISTS `inbox_unread` (
    `mail_id` int(11) NOT NULL AUTO_INCREMENT, 
    `date` datetime NOT NULL, 
    `body` text NOT NULL, 
    `to` varchar(255) NOT NULL, 
    `from` varchar(255) NOT NULL, 
    PRIMARY KEY (`mail_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

'00000' 顯然意味着成功,但它不應該被打印,如果它是成功的。數據庫中沒有插入任何內容。我確定這是一個錯字,但我找不到它。

SQL語句:

INSERT INTO inbox_unread (date, body, to, from) VALUES ('2013-01-04 23:40:58', 'test', 'will', 'will') 
+0

您是否嘗試使用try/catch塊來捕獲真正的錯誤而不是if/else?在你的代碼的最後部分? – inhan

+2

或者只是用'PDO :: ERRMODE_WARNING'啓用正常的錯誤報告。 – mario

+0

try/catch完全失敗。當我使用它時沒有任何反應。 – will

回答

3

您在查詢中有一個保留字:

$stmt = $this->database->prepare("INSERT INTO 
    inbox_unread (date, body, to, `from`) VALUES (:date, :body, :to, :from)"); 

的#1語法高亮顯示實際的這麼明顯。對於這樣的泛型列名,可能建議將它們全部反引號。

+0

是的,我看到有一次,我在這裏添加它。謝謝。 – will

+0

+1用於捕捉明顯缺乏反饋保留字的問題! – inhan

0

雖然我是用綁定經歷沒有,你綁定手動去反對你做了什麼。

http://php.net/manual/en/pdostatement.bindparam.php

嘗試刪除您echo使你的腳本看起來就像這樣:

$stmt->bindParam(":date", date("Y-m-d H:i:s")); 
    $stmt->bindParam(":body", $body); 
    $stmt->bindParam(":to", $to); 
    $stmt->bindParam(":from", $_SESSION['username']); 
+2

回聲不會影響它。他們只是輸出回報。 – will

+1

@WillHarrison你可以發佈一個粗略的打印出你的SQL模式數據嗎? –

+0

我已將它添加到原始帖子。 – will

1

替換此行:

echo $stmt->bindParam(":date", date("Y-m-d H:i:s")); 

這些:

$date = date("Y-m-d H:i:s"); 
echo $stmt->bindParam(":date", $date); 

,因爲bindParam()綁定可變參考不值。

+0

仍然不起作用:/ – will

+0

仍然無法正常工作。我已經檢查了所有參數,並且它們都已設定。 – will

+0

+1引用**,@Jeffrey – inhan

2

假設你的值是所有非空和有效(即您已經使用了var_dump(),以確保它們的值被收集如預期)...

首先,你可能想使用$stmt->errorInfo()而不是$this->database->errorInfo()因爲你」重新使用準備好的聲明。 The documentation,在「返回值」的最後一段部分讀取:

PDO::errorInfo()只爲操作直接對數據庫進行處理檢索錯誤信息。如果通過PDO::prepare()PDO::query()創建PDOStatement對象並在語句句柄上調用錯誤,則PDO::errorInfo()不會反映語句句柄中的錯誤。您必須致電PDOStatement::errorInfo()以返回在特定語句句柄上執行的操作的錯誤信息。

你可以做的另一件事是,var_dump$stmt->execute()通話,讓你將有什麼它返回一個確切的想法。

最後,mario是正確的關於錯誤報告。在文檔中查看PDO Errors and error handling,如果您想了解更多關於這些的更多詳細信息。

+0

+1的**變量很好,但我很好奇爲什麼執行失敗。一切安好。 – Shoe

+0

@Jeffrey我認爲你的觀點可能是原因。在執行階段,它綁定每個參數,並查找這些引用的值。所以一個字符串值本身就不會有任何引用。 – inhan