0

a1フィールド、a2a3b1、 、...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());
    }
}
4

1 に答える 1

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"
于 2013-09-10T23:08:48.643 に答える