a1
フィールド、a2
、a3
、b1
、 、...
をd1
含むMySQL テーブルがあります。各フィールドはCREATE ステートメントでd2
として宣言されています。BOOLEAN
(私も試しTINYINT(1)
ましたが、同じ問題がありました)。
次に、HTML フォームからデータを受け取るこの PHP 関数があります。
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"
...
出力は 1+ の有効な ID である必要がありますが、挿入に失敗したためlastInsertId()
0 が返されました。
$sql
コンパイルしたものを確認したところ、次のようになりました。
INSERT INTO property_classification (a1,a2,a3,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,c3,d1,d2) VALUES(?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?);
私も$data
コードで出力しました:implode(",",$data);
そして、それは私にこの出力を与えました:
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
入力が だったので、これは完璧でした"a1a2"
。
現在の唯一の問題は、次のように 2 つのビットをまとめたため、クエリが常に失敗する理由がわからないことです。
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 Query Browser で実行したところ、うまくいきました。
では、なぜ失敗するのPDO
でしょうか。
DBO クラス
function query($sql, $data) {
try {
$this->query = $this->db->prepare($sql);
if (!is_null($data) && is_array($data))
$this->query->execute($data);
else
$this->query->execute();
} catch (PDOException $e) {
array_push($this->log, $e->getMessage());
}
}