使用SQLITE&插入失败PHP PDO - 常规错误:25个绑定或列索引超出范围

时间:2013-03-13 22:15:19

标签: php sqlite pdo slim

我正在尝试使用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& amp; 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() .'}}';
    }
}

2 个答案:

答案 0 :(得分:0)

问题可能是PDO无法在一个查询中执行多个sql语句。要查看是否存在问题,只需将查询拆分为不同的调用。

如果您的系统满足在PDO中运行多个查询的要求,您也可以check here

答案 1 :(得分:0)

您尝试准备的SQL字符串包含2个SQL语句。我不确定,但可能SQLite(或PDO驱动程序)不支持这一点,因此只准备其中一个,这意味着另一个中的占位符未定义。

尝试将其分成两个单独的语句,每个语句都单独准备和执行。