我正在尝试使用 Slim 框架中的 PHP PDO 函数将一些数据插入到我的数据库中,但是当我使用 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() .'}}';
}
}
通过阅读,我相信我需要分别设置两个 :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() .'}}';
}
}