【问题标题】:PDO PHP MYSQL mixed named and positional parameters [closed]PDO PHP MYSQL混合命名和位置参数[关闭]
【发布时间】:2014-03-07 10:33:07
【问题描述】:

我已经尝试了几个小时才能让它工作。

<?php

require_once('inc.connect.php');

if( $_SERVER['REQUEST_METHOD'] == 'GET' )
{
    if( isset( $_REQUEST ))
    {
        $type  = array_keys($_REQUEST)[0];
        $value = $_REQUEST[$type];
        if( $value === null )
        {
            $where_like = null;
        }
        else
        {
            $where_like = ' WHERE ' . $type . '_name LIKE ?';
        }

        $db = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DBNAME . ';charset=UTF8', MYSQL_USERNAME, MYSQL_PASSWORD);
        $sql_statement = 'SELECT :' . $type . '_id, :' . $type . '_name FROM report_' . $type . $where_like;

        $sql_prepare = $db->prepare( $sql_statement );

        if( !(is_null($where_like)) ) $sql_prepare->bindValue(1, '"%' . $value . '%"', PDO::PARAM_STR);

        try{ 

            while( $sql_result = $sql_prepare->execute() )
            {
                $return[$sql_result[$type . '_id']] = $sql_result[$type . '_name'];
            }

            $return_JSON = json_encode($return);
        } 
        catch(PDOException $exception){

           return $exception->getMessage();
        } 
        echo "exception: ".$exception;
    }
}

我不断得到这个......

警告:PDOStatement::execute(): SQLSTATE[HY093]:无效参数号:混合命名参数和位置参数

【问题讨论】:

  • Prepared Statements 不是这样使用的。使用预定义的查询,不要在运行时生成它。查找教程并重写您的整个代码。
  • 为什么不呢?我知道它们通常不会像这样使用,但我认为动态创建查询没有任何问题。
  • 如果没有问题,为什么它不起作用?最好使用预定义的查询。正如您现在所看到的,它很清晰、易于理解,而且调试起来并不痛苦。
  • 你为什么要使用准备好的语句?
  • 我不是说傲慢的命令。再次,请明确定义逻辑。告诉我这不是它的使用方式是人们能得到的最不知情的答案。

标签: php mysql pdo prepared-statement


【解决方案1】:

我喜欢拥有一份稳定工作的一件事是,我不再需要担心我的 stackoverflow 帖子对潜在雇主的看法。本着这种精神,Your Common Sensejuergen d 都可以因为不合作的“某某”而“走一走”。

这是由 jQueryUI 自动完成({ source })选项请求的 AJAX 响应。

这是我完成的工作代码...

<?php

require_once('inc.connect.php');

if( $_SERVER['REQUEST_METHOD'] == 'GET' )
{
    if( isset( $_REQUEST ))
    {
        $type  = array_keys($_REQUEST)[0];

        if( in_array( $type, ['category', 'sub_category', 'names', 'report_searches', 'report_favs'] ))
        {
            $value  = $_REQUEST[$type];
            $id     = $type . '_id';
            $name   = $type . '_name';
            $table  = 'research_' . $type;
            $where  = $name;
            $like   = '%' . $value . '%';

            $value === null ? $where_like = null : $where_like = ' WHERE ' . $where . ' LIKE ?';

            $sql_db = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DBNAME . ';charset=UTF8', MYSQL_USERNAME, MYSQL_PASSWORD);
            $sql_statement = 'SELECT ' . $id . ', ' . $name . '  FROM ' . $table . $where_like;
            $sql_prepare = $sql_db->prepare( $sql_statement );

            if( !($value === null) ) $sql_prepare->bindParam(1, $like);

            try{
                if( $sql_prepare->execute() )
                {
                    while( $sql_result = $sql_prepare->fetch(PDO::FETCH_ASSOC) )
                    {
                        $return[$sql_result[$id]] = $sql_result[$name];
                    }

                    echo json_encode($return);
                }
            }
            catch(PDOException $e)
            {
                echo $e->getMessage();
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2015-09-02
    • 1970-01-01
    • 2020-04-27
    • 2018-07-21
    • 2016-07-26
    相关资源
    最近更新 更多