PDO PHP MYSQL混合了命名和位置参数

时间:2014-03-07 10:33:07

标签: php mysql pdo prepared-statement

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

<?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]:参数号无效:混合名称和位置参数

1 个答案:

答案 0 :(得分:4)

我喜欢拥有稳定工作的一件事是我不再需要担心我的stackoverflow帖子对潜在雇主的影响。本着这种精神,你的常识 juergen d 都可以“散步”,因为这样不合作的“so-and-sos”。

这是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();
            }
        }
    }
}