php - 获取 "SQLSTATE[HY093]: Invalid parameter number: parameter was not defined"

标签 php mysql sql database

我搜索了一个又一个关于这个错误的线程,每个人的错误在概念上都归结为参数丢失或拼写错误。我可能总共花了大约 4-5 个小时来寻找解决方案。这个问题我特地做了一个交代。

这是错误:

ERROR: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

不管出了什么问题,我的教授们也很困惑。无论如何,这里有一些我的代码片段:

注意:我将“location”设置为等于“todo-description”的内容,因为我还没有使用位置框格式化我的 HTML 页面。

解决方案:“截止日期”中的连字符是非法字符。

    $data = array(
        'todo-name' => array('name' => 'Todo Item Name','value' => '', 'errors' =>array()),
        'todo-list' => array('name' => 'Todo List', 'value' => '', 'errors' => array()),
        'todo-due-date' => array('name' => 'Due Date', 'value' => '','errors' => array()),
        'todo-location' => array('name' => 'Location', 'value' => '','errors' => array()),
        'todo-priority' => array('name' => 'Priority', 'value' => '','errors' => array()),
        'todo-description' => array('name' => 'Description', 'value' => '','errors' => array()) 
        );

    if($total_errors == 0)
{
    $date = DATETIME::createFromFormat('m/d/Y', $data['todo-due-date']['value']);
    $date = $date->format('Y-m-d');
    $data['todo-due-date']['value'] = $date;

    $query = "insert into todo_item(name, due_date, list, priority, location, description)
        values(:name, :due-date, :list, :priority, :location, :description);";

    $statement = $db->prepare($query);
    try
    {
        $statement->execute(array(
                'name' => $data['todo-name']['value'],
                'due-date' => $data['todo-due-date']['value'],
                'list' => $data['todo-list']['value'],
                'priority' => $data['todo-priority']['value'],
                'location' => $data['todo-description']['value'],
                'description' => $data['todo-description']['value']
                ));

        if($statement)                  
        {
            $position = $db->lastInsertId();
            header("Location: item.php?id=$position");
        }
    }
    catch(Exception $ex)
    {
        die("Could not execute query: {$ex->getMessage()}");
    }
}
else
{
    die('error');
}

最佳答案

根据PDO valid characters for placeholders的回答( https://stackoverflow.com/a/5810058/689579 )

http://lxr.php.net/xref/PHP_5_3/ext/pdo/pdo_sql_parser.re#49

有效的参数字符

BINDCHR = [:][a-zA-Z0-9_]+;

所以你的连字符参数 'due-date' 是无效的

关于php - 获取 "SQLSTATE[HY093]: Invalid parameter number: parameter was not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049221/

相关文章:

php - 跨页面传递从 mysql 数据库中选择的数据 id 并使用它在 php 中获取和显示更多数据是否安全?

mysql - 获取具有唯一或不同值的表?

sql - Oracle - 检查同一表中两列中的重复项

php - 如何使用 MAMP 安装 mysqlnd 驱动程序?

php - 在 codeception acceptance helper 中动态执行 DB dump

php - 提交表单并在同一页面上显示结果而无需刷新

sql - 子查询返回多行 SQL

mysql - 删除具有精确值的重复记录

mysql - mysql 中 except 的替代方案

mysql - 优化sql查询运行时间