我在ORDER BYSQL 的部分使用params时遇到问题.它不会发出任何警告,但不打印任何内容.
$order = 'columnName';
$direction = 'ASC';
$stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY :order :direction");
$stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR);
$stmt->bindParam(':order', $order, PDO::PARAM_STR);
$stmt->bindParam(':direction', $direction, PDO::PARAM_STR);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
该:my_param作品,但没有:order或:direction.是不是在内部正确转义?我是不是直接插入SQL?像这样:
$order = 'columnName';
$direction = 'ASC';
$stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");
Run Code Online (Sandbox Code Playgroud)
是PDO::PARAM_COLUMN_NAME常数还是等价?
谢谢!
You*_*nse 51
这里出现的问题表明,广受喜爱的预备声明不是银弹,呵呵:)
是的,当然,您可能会直接将其插入SQL中并采取一些预防措施.必须在脚本中对每个运算符/标识符进行硬编码,如下所示:
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders);
$order=$orders[$key];
$query="SELECT * from table WHERE is_live = :is_live ORDER BY $order";
Run Code Online (Sandbox Code Playgroud)
方向相同.
请注意,bindParam不会转义,因为根本不需要转义.它有约束力.
Pas*_*TIN 12
我认为你不能:
order by子句中使用占位符rra*_*ray 10
可能在ORDER BY子句中使用预处理语句,遗憾的是您需要传递名称列的命令,并且需要设置PDO_PARAM_INT类型.
在MySQL中,您可以使用此查询获取列的顺序:
SELECT column_name, ordinal_position FROM information_schema.columns
WHERE table_name = 'table' and table_schema = 'database'
Run Code Online (Sandbox Code Playgroud)
PHP代码:
$order = 2;
$stmt = $db->prepare("SELECT field from table WHERE column = :param ORDER BY :order DESC");
$stmt->bindParam(':param', $is_live, PDO::PARAM_STR);
$stmt->bindParam(':order', $order, PDO::PARAM_INT);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
我不认为您可以在准备好的语句中获得ASC / DESC,但是如果在SQL查询中将它们全部列出,则可以在列中找到,如下所示:
// Validate between 2 possible values:
$sortDir = isset($_GET['sortDir']) && $_GET['sortDir'] === 'ASC' ? 'ASC' : 'DESC';
$sql = "
...
order
by
case :orderByCol
when 'email' then email
when 'age' then age
else surname
end
$sortDir
";
$stmt = $db->prepare($sql);
$stmt->bindParam(':orderByCol', $someColumn);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
由于ASC / DESC只是两个可能的值,因此您可以轻松地使用php代码验证并在其中选择作为硬编码值。
您也可以为此使用ELT(FIELD(,,,,,,,,,,))函数,但是即使列是应该为使用数字语义/排序规则排序。
| 归档时间: |
|
| 查看次数: |
47824 次 |
| 最近记录: |