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() .'}}';
}
}