【发布时间】: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