1

Slimフレームワーク内でPHPPDO関数を使用してデータベースにデータを挿入しようとしていますが、curlを使用して投稿すると、次のエラーが発生します。

SQLSTATE [HY000]:一般エラー:25バインドまたは列インデックスが範囲外です

私が使用しているcurlコマンドは次のとおりです。

curl -i -X POST -H 'Content-Type: application/json' -d '{"category_name":"cat3",     "item_name":"test"}' http://localhost/api/add

問題のPHP関数は次のとおりです。

エラー機能

function addContent() {
    $request = \Slim\Slim::getInstance()->request();
    $content = json_decode($request->getBody());
    $sql = "insert into category (category_name) values (:category_name);
    insert into item (category_id,item_name) values 
    ((select category_id from category where category_name = :category_name2),     :item_name);";
    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);
        $stmt->bindParam("category_name", $content->category_name);
        $stmt->bindParam("category_name2", $content->category_name);
        $stmt->bindParam("item_name", $content->item_name);
        $stmt->execute();
        $db = null;
        echo json_encode($content);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}

SQLは基本的に、新しいカテゴリをカテゴリテーブルに追加してから、新しく作成されたカテゴリを参照する新しいアイテムをアイテムテーブルに追加します。sqlite内でクエリを実行すると、必要な行が適切に追加されているように見えます。クエリは次のとおりです。

insert into category(category_name) values ('cat2');
insert into item (category_id,item_name) values
((select category_id from category where category_name = 'cat2'),'item3');

すでに存在しているカテゴリについても同様の記述があり、正常に機能しているようです。

同様の作業機能

function addContent() {
    $request = \Slim\Slim::getInstance()->request();
    $content = json_decode($request->getBody());
    $sql = "insert into item (category_id,item_name) values
((select category_id from category where category_name = :category_name), :item_name);";
    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);
        $stmt->bindParam("category_name", $content->category_name);
        $stmt->bindParam("item_name", $content->item_name);
        $stmt->execute();
        $db = null;
        echo json_encode($content);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}

読んでみると、2つの:category_name参照を別々に設定する必要があると思います。そのため、:category_nameと:category_name2を使用しています。そうでなければ、私の知識が及ぶ限り、これは期待どおりに機能するはずです。アドバイスをいただければ幸いです。

IMSoPとjeroenの回答による作業機能

これは現在、必要に応じて機能していますが、おそらく最もきれいなソリューションではありませんが、機能します。アドバイスをありがとう。

function addContent() {
    $request = \Slim\Slim::getInstance()->request();
    $content = json_decode($request->getBody());
    $sql_category = "insert into category (category_name) values (:category_name);";
    $sql_item = "insert into item (category_id,item_name) values 
((select category_id from category where category_name = :category_name),     :item_name);";
    try {
        $db = getConnection();

        $stmt_category = $db->prepare($sql_category);
        $stmt_category->bindParam("category_name", $content->category_name);
        $stmt_category->execute();

        $stmt_item = $db->prepare($sql_item);
        $stmt_item->bindParam("category_name", $content->category_name);
        $stmt_item->bindParam("item_name", $content->item_name);
        $stmt_item->execute();

        $db = null;
        echo json_encode($content);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}
4

2 に答える 2

1

準備しようとしているSQL文字列には、2つのSQLステートメントが含まれています。確かなことはわかりませんが、SQLite(またはPDOドライバー)はこれをサポートしていない可能性が高いため、一方だけを準備します。つまり、もう一方のプレースホルダーは定義されていません。

それぞれを別々に準備して実行する2つの別々のステートメントに分けてみてください。

于 2013-03-13T22:26:25.533 に答える
0

問題は、PDOが1つのクエリで複数のSQLステートメントを実行できないことです。それが問題であるかどうかを確認するには、クエリを別の呼び出しに分割するだけです。

システムがPDOで複数のクエリを実行するための要件を満たしているかどうかもここで確認できます。

于 2013-03-13T22:24:30.523 に答える