MySQL插入动态失败但直接工作

时间:2013-09-10 22:54:21

标签: php mysql pdo innodb

我有一个MySQL表,其中包含字段a1a2a3b1...d1,{{ 1}},每个字段在CREATE语句中声明为d2。 (我也试过BOOLEAN但遇到了同样的问题。)

然后我有这个PHP函数从HTML表单接收数据:

TINYINT(1)

输出应该是1+以上的有效ID,但插入失败,因此public function add($a) { $sql = "INSERT INTO property_classification (a1,a2,a3,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,c3,d1,d2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; // creating the classification_id // e.g. "a1a2a3" => ["a1","a2","a3"] $classifications = str_split($a['classifications'], 2); $data = array(); // compile $data array foreach (self::$classification_fields as $classification) { // if user array contained any classification, set to true if (in_array($classification, $classifications)) { $data[$classification] = "1"; // I tried `true` too } else { $data[$classification] = "0"; // I tried `false` here } } // set type for binding PDO params foreach ($data as $key=>$value) settype($data[$key], 'int'); // tried 'bool' $this->db->query($sql, $data); $a['classification_id'] = $this->db->lastInsertId(); $this->log($a['classification_id']); // Output: "0" ... 返回0。

我查看了lastInsertId()编译到的内容,它来到了:

  

INSERT INTO property_classification(a1,a2,a3,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,c3,d1,d2)VALUES(?,?,?,?,? ,,,,,,,,,,,);???????????

我还输出$sql代码:$data,它给了我这个输出:

  

1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0

这是完美的,因为输入是implode(",",$data);

现在唯一的问题是我不明白为什么查询一直都会失败,因为我把这两个位放在一起就像这样:

  
    

INSERT INTO property_classification(a1,a2,a3,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,c3,d1,d2)VALUES(1,1,0,0,0) ,0,0,0,0,0,0,0,0,0,0,0);

  

然后我在MySQL查询浏览器中执行了该查询,它运行良好。

那么为什么它会在"a1a2"失败?


DBO类

PDO

1 个答案:

答案 0 :(得分:3)

由于您实际上是将关联数组传递给PDO,因此可以绑定到命名参数。 ?或位置占位符的使用需要标准的索引数组。如果您反对使用命名参数,只需将$data[$classification] =替换为$data[] =

即可

尝试以下内容。

public function add($a) {
    $sql = "INSERT INTO property_classification 
           (a1,a2,a3,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,c3,d1,d2) 
           VALUES(:a1,:a2,:a3,:b1,:b2,:b3,:b4,:b5,:b6,:b7,:b8,:c1,:c2,:c3,:d1,:d2);";

    // creating the classification_id
    // e.g. "a1a2a3" => ["a1","a2","a3"]
    $classifications = str_split($a['classifications'], 2);
    $data = array();
    // compile $data array
    foreach (self::$classification_fields as $classification) 
        $data[$classification] = in_array($classification, $classifications) ? 1 : 0;

    $this->db->query($sql, $data);
    $a['classification_id'] = $this->db->lastInsertId();
    $this->log($a['classification_id']); // Output: "0"