※ 引述《rjackie (向前走,才知道转角)》之铭言:
: <?php
: $keys = explode(" ",$_GET['p_search']);
: $term = "%".$_GET['p_search']."%";
: foreach ($keys as $word) {
: $search_name[] = 'product_info.name LIKE ?';
: $search_summary[] = 'product_info.summary LIKE ?';
: $search_model[] = 'product_standard_data.model LIKE ?';
: $arguments[] = '%'.$word.'%';
:
: }
: $product_info_auto_sql = $db->prepare("
: SELECT
: product_info.name
: FROM
: product_info,product_standard_data
: WHERE
: product_info.no = product_standard_data.product_no
: AND
: ".implode(' AND ', $search_name)."
: OR
: ".implode(' AND ', $search_summary)."
: OR
: ".implode(' AND ', $search_model)."
: AND
: product_info.status = '1' GROUP BY product_info.name order by product_in
: fo.sequence DESC, product_info.name DESC");
: $product_info_auto_sql->execute($arguments);
: while($product_info_auto_row = $product_info_auto_sql->fetch()){
: echo $product_info_auto_row['name'];
: }
: ?>
:
: 问题在于无法在execute的时候会发生
: Invalid parameter number: number of bound variables does not match number
: 有尝试过arguments使用三次当然一定会错,或是将$term变成阵列方式但还是有问题。
: 不知道这情况是否有什么建议作法呢?
: 感恩
你的WHERE字串,串起来后好像都没有括号?
只看到 implode 的括号,但是字串串起来后,应该是没有括号。
类似 WHERE condA1 AND condA2 OR condB1 AND condB2 OR condC1 AND cond C2 ...
一堆AND跟OR挤在一起,这样有问题吧。
应该改成
WHERE
(product_no=123 AND status=1)
AND (
(condA1 AND condA2) /*search_name*/
OR (condB1 AND condB2) /*search_summary*/
OR (condC1 AND condC2) /*search_model*/
)
而且可以使用名称变量,不使用问号。
SELECT ... WHERE col1=:col1 AND col2=:col2
下面只使用 search_name 跟 search_model , 仅供参考。
foreach ($keys as $key=>$word) {
$search_name[] = 'product_info.name LIKE :word' . $key;
/*
$search_name = array(
'product_info.name LIKE :word1',
'product_info.name LIKE :word2',
...
);
*/
$search_model[] = 'product_standard_data.model LIKE :word' . $key;
/*
$search_model = array(
'product_standard_data.model LIKE :word1',
'product_standard_data.model LIKE :word2',
...
);
*/
}
$whName = implode(' AND ', $search_name);
//product_info.name LIKE :word1 AND product_info.name LIKE :word2
$whModel = implode(' AND ', $search_model);
//类似上面
$sql = "
SELECT ...
WHERE
(info.no = standard_data.product_no AND info.status = '1')
AND (
(" . $whName . ")
OR (" . $whModel . ")
OR (" . $whSummary . ")
)
";
$result = $dbh->prepare($sql);
foreach($keys as $key=>$word){
$keystr = 'word' . $key; //word1, word2...
$$keystr = $word; //注意符号是两个
$result->bindParam(':'.$keystr, $$keystr);
}
$result->execute();
我之前写过的大概是这样。
会用两个符$符号,记得是因为 bindParam 使用的变量不允许重复。
因为 bindParam 的意思就是把变量跟值绑定在一起,
绑定了,就不能改,所以不能跑循环。
$$keystr 会先变成 $word1 或 $word2, 然后值就是该次的 $word
不保证成功,可能要再多测试。