带explode/intlode和PHP PDO的多术语SQL
我有一个搜索表单,希望用户搜索多个词。我目前正在使用PHP PDO,我还在学习。。。我想知道是否有人能告诉我我做错了什么带explode/intlode和PHP PDO的多术语SQL,php,search,full-text-search,pdo,search-engine,Php,Search,Full Text Search,Pdo,Search Engine,我有一个搜索表单,希望用户搜索多个词。我目前正在使用PHP PDO,我还在学习。。。我想知道是否有人能告诉我我做错了什么 $varSearch = @$_GET['dms']; $varTerm = explode(" ", $varSearch); $termArray = array(); foreach($varTerm as $term){ $term = trim($term); if(!empty($term)){
$varSearch = @$_GET['dms'];
$varTerm = explode(" ", $varSearch);
$termArray = array();
foreach($varTerm as $term){
$term = trim($term);
if(!empty($term)){
$termArray[] = "name LIKE '%".$term."%' OR tags LIKE '%".$term."%'";
}
}
$implode = implode(' OR ', $termArray);
$sql = $dbh->prepare("SELECT * FROM table WHERE ?");
$sql->execute(array($implode));
如果其他人也需要这个答案
$varSearch = @$_GET['dms'];
$varTerm = explode(" ", $varSearch);
$termArray = array();
foreach($varTerm as $term){
$term = trim($term);
if(!empty($term)){
$termArray[] = "name LIKE :term OR tags LIKE :term";
}
}
$implode = implode(' OR ', $termArray);
$sql = $dbh->prepare("SELECT * FROM table WHERE ".$implode."");
$sql->execute(array(":term"=>"%".$term."%"));
如果其他人也需要这个答案
$varSearch = @$_GET['dms'];
$varTerm = explode(" ", $varSearch);
$termArray = array();
foreach($varTerm as $term){
$term = trim($term);
if(!empty($term)){
$termArray[] = "name LIKE :term OR tags LIKE :term";
}
}
$implode = implode(' OR ', $termArray);
$sql = $dbh->prepare("SELECT * FROM table WHERE ".$implode."");
$sql->execute(array(":term"=>"%".$term."%"));
您是否考虑过这样做:
$varSearch = @$_GET['dms'];
$varTerm = explode(" ", $varSearch);
$termsStringArray = array();
$termsArray = array();
foreach($varTerm as $term){
$term = trim($term);
if(!empty($term)) {
array_push($termsStringArray, "name LIKE ? OR tags LIKE ? ");
array_push($termsArray, $term);
array_push($termsArray, $term); // note, you can do this part differently, if you'd like
}
}
$implodedTermsString = implode('OR ', $termsStringArray);
$sql = $dbh->prepare("SELECT * FROM biz WHERE " . $implodedTermsString);
$sql->execute(array($termsArray));
输出:
// prepare statement
SELECT * FROM biz WHERE name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ?
// $termsArray (for execute)
Array
(
[0] => this
[1] => this
[2] => is
[3] => is
[4] => the
[5] => the
[6] => string
[7] => string
)
基本上,尝试从初始SQL查询prepare
字符串中分离数组数据。让我知道这是否对你有效
不过,您仍然需要对从$\u GET
变量中获取的数据进行某种检查(或清理)。该$\u GET
变量可能包含任何内容。。。而且可能对健康或其他不必要的问题有害
而且,像这样的
不一定是进行此类数据库搜索的最有效方法。但是如果你使用它(我过去也用过它来搜索东西),试着去看看:。你考虑过这样做吗
$varSearch = @$_GET['dms'];
$varTerm = explode(" ", $varSearch);
$termsStringArray = array();
$termsArray = array();
foreach($varTerm as $term){
$term = trim($term);
if(!empty($term)) {
array_push($termsStringArray, "name LIKE ? OR tags LIKE ? ");
array_push($termsArray, $term);
array_push($termsArray, $term); // note, you can do this part differently, if you'd like
}
}
$implodedTermsString = implode('OR ', $termsStringArray);
$sql = $dbh->prepare("SELECT * FROM biz WHERE " . $implodedTermsString);
$sql->execute(array($termsArray));
输出:
// prepare statement
SELECT * FROM biz WHERE name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ?
// $termsArray (for execute)
Array
(
[0] => this
[1] => this
[2] => is
[3] => is
[4] => the
[5] => the
[6] => string
[7] => string
)
基本上,尝试从初始SQL查询prepare
字符串中分离数组数据。让我知道这是否对你有效
不过,您仍然需要对从$\u GET
变量中获取的数据进行某种检查(或清理)。该$\u GET
变量可能包含任何内容。。。而且可能对健康或其他不必要的问题有害
而且,像
这样的不一定是进行此类数据库搜索的最有效方法。但是如果你用它(我过去也用过它来搜索东西),试试看:。重拍
$my_explode = explode(" ",$search);
$query = array();
foreach($my_explode as $string)
{
$query[] ="name LIKE '%".$string."%' OR email LIKE '%".$string."%'";
}
$implode = implode(' OR ', $query);
foreach ($db->query("SELECT * FROM _table WHERE ".$implode."") as $info)
{
echo $info['name']."<br />";
}
翻拍
可能重复的感谢,我回答了我自己的问题,并发布了它,以防其他人需要。可能重复的感谢,我回答了我自己的问题,并发布了它,以防其他人需要。你只是在搜索你的数据库中的一个词。我不是在数组中做这件事吗?我不明白。为什么我得到的是否定的…不,你准备了一个非常长的语句,在这里你重复使用完全相同的参数名,然后绑定一个参数到它。你得到了否决票,因为你的答案是错误的。事实上,我刚刚检查了数组输出的内容,我相信我的解决方案是正确的……假设我输入term1和term2,那么它将搜索像term1这样的名称或像term1这样的标记或像term2这样的名称或像term2这样的标记
。。。这使人们能够在名称表和标记表中搜索两个不同的术语您只在数据库中搜索一个术语。我不是在数组中搜索吗?我不明白。为什么我得到的是否定的…不,你准备了一个非常长的语句,在这里你重复使用完全相同的参数名,然后绑定一个参数到它。你得到了否决票,因为你的答案是错误的。事实上,我刚刚检查了数组输出的内容,我相信我的解决方案是正确的……假设我输入term1和term2,那么它将搜索像term1这样的名称或像term1这样的标记或像term2这样的名称或像term2这样的标记
。。。这使人们能够在名称表和标记表中搜索两个不同的术语我认为prepare
不受SQL注入的影响?我一定是在你写评论时更新了这个…:)在数据进入将与数据库一起使用的内容之前,通常最好先对数据进行清理。也谢谢。。我的答案不也是这样吗?将其放入数组?有点像@Brad在他后来的评论中暗示的那样,我相信你之前的答案最终还是会搜索相同的:term
。。。因为:term
最终是数组中代码末尾的唯一键,对吗?:)我给出的备选答案应该包括您正在搜索的所有术语,因为所有术语都在一个单独的数组中(termsArray
)。。。而prepare
字符串(内爆termsString
)只对每个单独的数组值使用?
。我得到一个错误警告:array\u push()期望参数1为array,
我认为prepare
不受SQL注入的影响?我一定是在你写评论时更新的…:)在数据进入将与数据库一起使用的内容之前,通常最好先对数据进行清理。也谢谢。。我的答案不也是这样吗?将其放入数组?有点像@Brad在他后来的评论中暗示的那样,我相信你之前的答案最终还是会搜索相同的:term
。。。因为:term
最终是数组中代码末尾的唯一键,对吗?:)我给出的备选答案应该包括您正在搜索的所有术语,因为所有术语都在一个单独的数组中(termsArray
)。。。而prepare
字符串(inbodedtermsString
)只对每个单独的数组值使用?
。我得到一个错误警告:array\u push()期望参数1为array,