我在php中使用PDO。但是,当我的查询中有任何像" ' "意味着连字符断裂并通过错误。 我准备通过互联网找到解决方案绑定参数与查询,它工作正常。 但问题是我在循环中构建查询,我无法在循环中绑定参数。 这是我用空格分割数组并在每个关键字上运行查询的代码。 前三个单词只有查询和超过3个单词我使用循环来连接所有数组元素和相同的多于6个单词我正在使用MATCH查询。 有没有办法逃脱这个连字符,或者我怎么能在我的情况下使用循环绑定参数?
$keyword = ($_POST['keyword']);
$keyword_array = split(' ',$keyword);
/* Query For first Three Words */
if(count($keyword_array)<=3){
$sql = "SELECT * FROM faq WHERE question LIKE '%$keyword%' limit 14";
}
/* Query through all array when words are greater then 3 */
if(count($keyword_array)< 6){
$sql = "SELECT * FROM faq WHERE question ";
for($i = 0 ; $i<count($keyword_array); $i++){
if($i==0){
$sql.=" LIKE '%$keyword_array[$i]%'";
}else{
$sql.=" or question LIKE '%$keyword_array[$i]%' ";
}
}
$sql .= " ORDER BY question ASC LIMIT 0, 8";
}
/* Appl FULL TEXT in natual language mode once we have enough phrase */
else if(count($keyword_array)>=6){
$sql = "SELECT * FROM faq WHERE ";
for($i = 0 ; $i<count($keyword_array); $i++){
if($i==0){
$sql.=" MATCH (answer) AGAINST ('$keyword_array[$i]' in natural language mode) ";
}else{
$sql.=" or MATCH(answer) AGAINST('$keyword_array[$i]' in natural language mode) ";
}
}
$sql .= " limit 0,5";
}
$execute_faq_query = $conn->query($sql);
$execute_faq_query->setFetchMode(PDO::FETCH_ASSOC);
while ($list = $execute_faq_query->fetch()){
}
答案 0 :(得分:2)
在构建动态查询时,您需要将查询中那些静态的部分与动态查询部分分开。
您可以看到以下代码是静态的。
"SELECT * FROM faq ";
其余代码是动态的。过滤记录时,使用WHERE子句和AND&amp; OR运算符用于根据多个条件过滤记录。如果第一个条件和第二个条件都为真,则AND运算符显示记录。如果第一个条件或第二个条件为真,则OR运算符显示记录。因此,对于第一个条件,使用WHERE但在此之后必须使用AND或OR(在您的示例中使用OR)
// Static code
sql = "SELECT * FROM `faq`"
// Set initial condition to WHERE
clause = "WHERE";
if( !empty( filter )){
Add clause to sql
Add condition to sql
change clause to OR or AND as required
}
对每个过滤器重复一次 请注意,在应用过滤器之前不会更改过滤器,并且在更改后仍保持更改。 在处理完所有过滤器后,将添加剩余的静态代码(如果有)。
我使用过Switch Case来应用过滤器和未命名的参数?。
尽可能使用“lazy”绑定 - 将数据传递给execute将大大缩短您的代码。见PDO info。
//Test $POST[] remove after testing
$_POST['keyword'] ="one two three four five six";
$keyword = ($_POST['keyword']);
$keyword_array = split(' ',$keyword);
$words = count($keyword_array);
echo $words;
//You need an array to store parameters
$paramArray =array();
//Initial clause
$clause = "WHERE";
//Start with a basic stub
$sql = "SELECT * FROM faq ";
switch (true) {
case $words <= 3:
$sql .= " $clause question LIKE ?";
$keyword = "%$keyword%";
array_push($paramArray,$keyword);
$limit = " LIMIT 14";
break;
case $words < 6:
for($i = 0 ; $i<count($keyword_array); $i++){
$sql .= " $clause question LIKE ?";
$keyword = "%$keyword_array[$i]%";
array_push($paramArray,$keyword);
$clause = "OR";
$limit = " ORDER BY question ASC LIMIT 0, 8";
}
break;
case $words >=6:
$clause = "";
for($i = 0 ; $i<count($keyword_array); $i++){
$sql.=" $clause MATCH (answer) AGAINST (? in natural language mode) ";
array_push($paramArray,$keyword_array[$i]);
$clause = "OR";
$limit = " limit 0,5";
}
break;
}
//echo query and parameter array remove after testing
echo $sql;
echo "<br>";
print_r($paramArray);
//Prepare and execute query
$execute_faq_query = $conn->prepare($sql);
$execute_faq_query->execute($paramArray);
$execute_faq_query->setFetchMode(PDO::FETCH_ASSOC);
while ($list = $execute_faq_query->fetch()){
}