2013-02-24 101 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();