我试图在Slim框架内使用PHP PDO函数插入一些数据到我的数据库中,但当我使用curl发布时,我得到以下错误;
SQLSTATE[HY000]: error: bind or column index out of range
我使用的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 = SlimSlim::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 = SlimSlim::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() .'}}';
}
}
通过阅读,我认为我需要分别设置两个:category_name引用,这就是为什么我有:category_name &: category_name2。否则,据我所知,这应该像预期的那样工作。如有任何建议,不胜感激。
工作功能由IMSoP提供;珀斯的答案
现在按要求工作,虽然可能不是最漂亮的解决方案,但完成了工作。谢谢你们的建议。
function addContent() {
$request = SlimSlim::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() .'}}';
}
}
您正在尝试准备的SQL字符串包含2个SQL语句。我不确定,但很可能SQLite(或PDO驱动程序)不支持这个,所以只准备其中一个,这意味着另一个中的占位符没有定义。
试着把它分成两个单独的语句,每个语句分别准备和执行。
问题可能是PDO不能在一个查询中执行多个sql语句。要查看这是否是问题所在,只需将查询拆分为不同的调用。
您也可以在这里检查您的系统是否满足在PDO中运行多个查询的要求