我有一个MySQL表,其中包含字段a1
,a2
,a3
,b1
,...
,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"
失败?
PDO
答案 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"