我目前有一个只有两个元素的小搜索表单:一个名为search的文本输入和一个名为param的“select”框.在该框中选择的选项应该用作参数,以选择将获取我的数据库中的哪个表列.
使用mysql_函数,可以这样做:
$param = $_POST['param' ]; $search = $_POST['search']; $query = 'SELECT * FROM table WHERE $param LIKE "%$search%"';
但我无法使用mysqli_语法.我正在尝试使用准备好的语句,但到目前为止我做的最好的是:
$param = $_POST['param' ]; $search = $_POST['search']; if($param == 'first_name') { if($prep = $link->prepare('SELECT * FROM table WHERE first_name LIKE CONCAT("%",?,"%")')) { $prep->bind_param('s',$search); $prep->execute(); $prep->bind_result($first_name,$last_name); while($prep->fetch()) echo $first_name . ' ' . $last_name; $prep->close(); } else echo 'Error while preparing statement.'; } else if($param == 'last_name') { ... }
但是,只是使用一堆其他ifs似乎有很多重复和非生产性,特别是如果我有很多列要处理.
我尝试的第一件事是参数绑定 – … WHERE? LIKE …和$prep-> bind_param(‘ss’,$param,$search) – 但是它不起作用(我仍然不知道为什么).
有没有办法以更聪明的方式做到这一点?
如果您为每个参数使用相同的SQL代码,只需创建可能的参数的散列:(CGI参数名称=>表列名称)
$params = array( 'first_name' => 'first_name','last_name' => 'last_name',);
从安全的角度来看,这是更好的,因为您可以防止SQL注入.
然后从哈希中获取列名并将其放入查询中 – 您将摆脱if-s:
$name = $params[$param]; $sql = "SELECT * FROM table WHERE $name LIKE ?"; if($prep = $link->prepare($sql)) { $prep->bind_param('s',"%$search%"); ...
正如@Akam所说,查询中不需要CONCAT(“%”,?,“%”) – 最好将值与前面的百分比绑定.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。