2013-02-24 228 views
0

我是新的PDO,我試圖插入數據到表中。PHP PDO插入數據

這是我的表:

CREATE TABLE `Message` (
`ID` INT(8) NOT NULL AUTO_INCREMENT , 
`DateTime` DATETIME NOT NULL , 
`SmsSid` VARCHAR(34) NOT NULL , 
`AccountSid` VARCHAR(34) NOT NULL , 
`From` VARCHAR(12) NOT NULL , 
`To` VARCHAR(12) NOT NULL , 
`Body` VARCHAR(160) NOT NULL , 
`FromCity` VARCHAR(50) NULL , 
`FromState` VARCHAR(50) NULL , 
`FromZip` VARCHAR(50) NULL , 
`FromCountry` VARCHAR(50) NULL , 
`ToCity` VARCHAR(50) NULL , 
`ToState` VARCHAR(50) NULL , 
`ToZip` VARCHAR(50) NULL , 
`ToCountry` VARCHAR(50) NULL , 
`ConversationNumber` INT(4) NOT NULL , 
PRIMARY KEY ( `ID`) 
) ENGINE = MYISAM 

這就是我想要插入到表中的PHP代碼。什麼是做這個插入語句的正確方法? prepare()query()exec()?

我能夠通過使用這個類似的代碼插入到一個不太複雜的表中,但不是上面這個。我不確定究竟是什麼導致了問題,語法,列類型,自動增量,日期時間?有沒有這張表,我不處理正確的插入查詢?另外,我是否正確處理異常/錯誤處理以查看我需要幫助調試的正確錯誤消息?

<?php 
try 
{ 
$connectionString = new PDO("mysql:host=xxxx;dbname=xxxx;","xxxx","xxxx"); 
} 
catch(PDOException $e) 
{ 
echo 'Connection failed'.$e->getMessage(); 
} 

$DateTime = "NOW()"; 
$SmsSid = "abcdef"; 
$AccountSid = "abcdef"; 
$FromWho = "abcdef"; 
$To = "abcdef"; 
$Body = "abcdef"; 
$FromCity = "abcdef"; 
$FromState = "abcdef"; 
$FromZip = "abcdef"; 
$FromCountry = "abcdef"; 
$ToCity = "abcdef"; 
$ToState = "abcdef"; 
$ToZip = "abcdef"; 
$ToCountry = "abcdef"; 
$ConversationNumber = "abcdef"; 

try 
{ 
$executeQuery = $connectionString->prepare("INSERT INTO Message (SmsSid,AccountSid,`From`,To,Body,FromCity,FromState,FromZip,FromCountry,ToCity,ToState,ToZip,ToCountry,ConversationNumber) VALUES (:SmsSid,:AccountSid,:FromWho,:To,:Body,:FromCity,:FromState,:FromZip,:FromCountry,:ToCity,:ToState,:ToZip,:ToCountry,:ConversationNumber)"); 

$executeQuery->execute(array(':SmsSid'=>$SmsSid,':AccountSid'=>$AccountSid,':FromWho'=>$FromWho,':To'=>$To,':Body'=>$Body,':FromCity'=>$FromCity,':FromState'=>$FromState,':FromZip'=>$FromZip,':FromCountry'=>$FromCountry,':ToCity'=>$ToCity,':ToState'=>$ToState,':ToZip'=>$ToZip,':ToCountry'=>$ToCountry,':ConversationNumber'=>$ConversationNumber)); 


} 
catch(PDOException $e) 
{ 
echo 'Query failed'.$e->getMessage(); 
} 

$connectionString = null; 
?> 
+0

您是否收到任何錯誤?順便說一句,我假設所有這些佔位符都是變量,爲什麼你不附加一個$給他們? 此外,如果您知道佔位符(列字段)的順序,那麼您可以使用問號語法,而不是混亂。 – silkfire 2013-02-24 23:51:47

+1

請不要包含「非常感謝幫助。」在你的問題。這是無用的噪音。 – Doorknob 2013-02-24 23:52:23

+1

@Doorknob在我的回答經驗中,很少有人讚賞 – 2013-02-24 23:54:22

回答

3

From是MySQL中的一個保留字。當你使用它作爲一個列的名稱,你有反引號包圍它作爲

`From` 

默認情況下,PDO不拋出異常。爲了讓扔在錯誤異常,請撥打

$pdoObject->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+0

這是給我「警告:PDO :: setAttribute()期待2個參數,1給出」 – Jsn0605 2013-02-24 23:58:04

+0

@ Jsn0605對不起,我糾正了錯誤 – 2013-02-25 00:00:40

+0

謝謝,這有助於一堆,但我仍然無法找到我的語法錯誤。 「SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法錯誤;查看與您的MySQL服務器版本相對應的手冊,以找到正確的語法,以便在」From,To,Body,FromCity,FromState, FromZip,FromCountry,ToCity,ToState,ToZip,ToCount'in line 1「 – Jsn0605 2013-02-25 00:02:37

0

這是你逃脫(與backticks:`)真正重要的表名和列名也。例如,FROM是MySQL中的保留關鍵字。

$SmsSid    = "abcdef"; 
$AccountSid   = "abcdef"; 
$From    = "abcdef"; 
$To     = "abcdef"; 
$Body    = "abcdef"; 
$FromCity   = "abcdef"; 
$FromState   = "abcdef"; 
$FromZip   = "abcdef"; 
$FromCountry  = "abcdef"; 
$ToCity    = "abcdef"; 
$ToState   = "abcdef"; 
$ToZip    = "abcdef"; 
$ToCountry   = "abcdef"; 
$ConversationNumber = "abcdef"; 

try { 
    $executeQuery = $connectionString->prepare('INSERT INTO `Message` (`SmsSid`, `AccountSid`, `From`, `To`, `Body`, `FromCity`, `FromState`, `FromZip`, `FromCountry`, `ToCity`, `ToState`, `ToZip`, `ToCountry`, `ConversationNumber`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); 

    $executeQuery->execute(array($SmsSid, $AccountSid, $From, $To, $Body, $FromCity, $FromState, $FromZip, $FromCountry, $ToCity, $ToState, $ToZip, $ToCountry, $ConversationNumber)); 
} 
catch(PDOException $e) { 
     echo 'Query failed' . $e->getMessage(); 
} 
0

嘗試使用抽象庫的一些動作自動化,如safemysql
你看,你的代碼可以大大縮短,而無需多次,重複每個變量的名字 - 最重要的 - 沒有必要去關心字段名是否是一個保留字或不 - 所有格式都將自動完成:

<?php 
$db = new safemysql('host'=>'xxxx','db'=>'xxxx','user'=>"xxxx",'pass'=>"xxxx"); 
$insert = array( 
    'SmsSid'    => "abcdef", 
    'AccountSid'   => "abcdef", 
    'From'    => "abcdef", 
    'To'     => "abcdef", 
    'Body'    => "abcdef", 
    'FromCity'   => "abcdef", 
    'FromState'   => "abcdef", 
    'FromZip'   => "abcdef", 
    'FromCountry'  => "abcdef", 
    'ToCity'    => "abcdef", 
    'ToState'   => "abcdef", 
    'ToZip'    => "abcdef", 
    'ToCountry'   => "abcdef", 
    'ConversationNumber' => "abcdef", 
); 
$db->query("INSERT INTO Message SET DateTime = NOW(), ?u", $insert); 
?> 

請注意,我直接添加NOW()函數調用到查詢,因爲它是MySQL函數,不需要格式化。

0
try { 
$db = new PDO('mysql:host=localhost;dbname=test_vendor_management_system', 'root', ''); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
}catch(PDOException $e) { 
echo 'ERROR: ' . $e->getMessage(); 
} 

嘗試{

$stmt = $db->prepare("INSERT INTO car_details(`car_name`,`model_no`,`maker_id`,`dealer_id`,`car_added`) VALUES(?,?,?,?,NOW())"); 
$stmt->execute(array($carcar_name,$model_no,$maker_id,$dealer_id));    
echo "2nd Insertion Done -".$affected_rows = $stmt->rowCount(); 

}趕上(PDOException $ E){

echo 'ERROR: ' . $e->getMessage(); 

}

try { 

    $values = array($carcar_name, $model_no, $maker_id, $dealer_id); 
$stmt = $db->prepare("INSERT INTO car_details 
        (`car_name`,`model_no`,`maker_id`,`dealer_id`,`car_added`) 
        VALUES 
        (:car_name,:model_no,:maker_id,:dealer_id,NOW()) 
        "); 
$stmt->bindParam(':car_name', $carcar_name, PDO::PARAM_STR); 
$stmt->bindParam(':model_no', $model_no, PDO::PARAM_STR); 
$stmt->bindParam(':maker_id', $maker_id, PDO::PARAM_INT); 
$stmt->bindParam(':dealer_id', $dealer_id, PDO::PARAM_INT); 
    $stmt->execute(); 
    echo "3rd Insertion Done -".$affected_rows = $stmt->rowCount(); 
    echo "3rd Insertion Id -".$insertId = $db->lastInsertId(); 
    }catch(PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
    } 








$carcar_name="ESCORT/SQUIRE"; 
$model_no="234"; 
$maker_id="21"; 
$dealer_id="12"; 

try { 

    $stmt = $db->prepare("INSERT INTO car_details(`car_name`,`model_no`,`maker_id`,`dealer_id`,`car_added`) VALUES(?,?,?,?,NOW())"); 
    $stmt->execute(array($carcar_name,$model_no,$maker_id,$dealer_id));    
    echo "2nd Insertion Done -".$affected_rows = $stmt->rowCount(); 
}catch(PDOException $e) { 

    echo 'ERROR: ' . $e->getMessage(); 
} 




try { 
    $stmt = $db->prepare("INSERT INTO car_details 
        (car_name,model_no,maker_id,dealer_id,car_added) 
        VALUES 
        (:car_name,:model_no,:maker_id,:dealer_id,:car_added)"); 

$stmt->execute(array(':car_name'=>$carcar_name, 
        ':model_no'=>$model_no, 
        ':maker_id'=>$maker_id, 
        ':dealer_id'=>$dealer_id, 
        ':car_added'=>$car_added)); 

echo "1st Insertion Done -".$affected_rows = $stmt->rowCount(); 
}catch(PDOException $e) { 

    echo 'ERROR: ' . $e->getMessage(); 
} 
0
$sql = "INSERT INTO books2 (title,author,cover) values(?,?,?)"; 

$q = $conn->prepare($sql); 

$q->bindParam(1, $title); 

$q->bindParam(2, $author); 

$q->bindParam(3, $cover, PDO::PARAM_LOB); 

$q->execute();