use*_*729 16 php pdo prepared-statement
我想使用一个准备好的语句,其中传入的参数用于ORDER BY和LIMIT子句,如下所示:
$sql = 'SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(
'sort' => $_GET['sort'],
'dir' => $_GET['dir'],
'start' => $_GET['start'],
'results' => $_GET['results'],
)
);
Run Code Online (Sandbox Code Playgroud)
但$stmt->fetchAll(PDO::FETCH_ASSOC);什么都不回报.
有人能指出我在做什么是错的吗?可以吗?如果没有,我应该参考哪些条款的完整列表可以使用参数?
Ark*_*rkh 20
使用后:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)
我收到了消息:
带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的"0","10"附近使用正确的语法
因此,当您使用数组执行时,它会将您的输入视为字符串,这对LIMIT来说不是一个好主意
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':start', $_GET['start'], PDO::PARAM_INT);
$stmt->bindParam(':results', $_GET['results'], PDO::PARAM_INT);
$stmt->bindParam(':sort', $_GET['sort']);
$stmt->bindParam(':dir', $_GET['dir']);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($data);
Run Code Online (Sandbox Code Playgroud)
您不能绑定参数来指定语言关键字或字段名称 - 它必须替换文字。因此,我认为你的极限值很好,但你的排序依据却不行。最好手动替换字符串中的 sort 和 dir。转义它们,但不要使用数据库工具来执行此操作,因为它们不是字符串文字。基本上确保不存在特殊字符。
| 归档时间: |
|
| 查看次数: |
15288 次 |
| 最近记录: |