我正在构建一个搜索引擎,我一直在尝试在PHP中构造参数化的SQL语句。我想知道可以使用参数的规则是什么。
e.g。这有效:
$var = $unsafevar;
$stmt = mysqli_prepare($connection, "SELECT * FROM users WHERE username = ?");
mysqli_stmt_bind_param($stmt, 's', $var);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);
这不是:
$var = 'SELECT';
$var2 = 11;
$stmt = mysqli_prepare($connection, "? * FROM users WHERE username = ?");
mysqli_stmt_bind_param($stmt, 'ss', $var, $var2);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);
哪里可以使用参数,哪些不可以?
或者,更简单地说,paramaterization字面上对变量做了什么?它是否在它们周围加上单引号?如果是这种情况,有没有办法对通配符,列名或SQL子句本身进行参数化?
答案 0 :(得分:3)
无法参数化数据库,模式,表格和列名称 - 如果您希望“参数化”它们,则需要求助于dynamic SQL。
链接文章是关于动态SQL使用的广泛讨论,主要涉及SQL Server,但适用于大多数SQL数据库。
答案 1 :(得分:2)
我的参数助记符是:
您可以使用单个标量值的任何地方,您可以使用参数。
即,引用的字符串文字,引用的日期文字或数字文字。
其他任何内容(标识符,SQL关键字,表达式,子查询,IN()
谓词的值列表等)都无法参数化。