我正在运行在Coldfusion8/MySQL 5.0.88
数据库上运行的应用程序。
该应用程序有一个搜索表单,用户可以使用该表单搜索产品ID。
现在我的SQL语句如下所示:
...
AND a.product_id LIKE <cfqueryparam value="%#form.s_product_id#%" cfsqltype="cf_sql_varchar">
用户通常会传递single id
或partial id
,因此我需要此功能才能同时使用:
123456 (full id)
123 (partial id)
但是,我还想让用户搜索多个ID。因此用户可以输入:
12345,233345,78876
问题:
我可以在提交表单之前清除空格,但是如何创建它以便我的MySQL搜索处理程序correclty将其标识为列表。如果我只使用IN
代替LIKE
,我会丢失partial_ID,不是吗?
答案 0 :(得分:1)
我不是在进行coldfusion,但你需要在逗号中拆分ID列表并构建一个这样的查询:
... AND (a.product_id LIKE '%12345%' OR a.product_id LIKE '%123%' OR a.product_id LIKE '%78876%') ...
答案 1 :(得分:1)
因此,有效的ColdFusion解决方案可能是:
<cfquery name="your_query_name" datasource="your_datasource">
SELECT column1, column2
FROM a
WHERE condition=whatever
<cfif listlen(form.s_product_id)>
AND (1=0 /* always false; for SQL syntax only */
<cfloop list="#form.s_product_id#" index="variables.s_product_id_ii">
OR a.product_id LIKE <cfqueryparam value="%#variables.s_product_id_ii#%" cfsqltype="cf_sql_varchar" />
</cfloop>)
</cfif>
</cfquery>
如果'a.product_id'是整数字段,请考虑将其强制转换为VARCHAR
CAST(a.product_id AS VARCHAR(50)) LIKE <cfqueryparam...
所以这个查询不会在不同的,更严格的数据库上中断。 或者,由于您将form.s_product_id列表拆分为其组件整数,因此可以将cfqueryparam cfsqltype更改为“cf_sql_integer”。
答案 2 :(得分:1)
<?php
include('config.php');
if (!empty($_REQUEST['term'])) {
$term = mysql_real_escape_string($_REQUEST['term']);
$sql ="Select product.id,costomer.name,costomer.mobile,product.cid,product.pname,product.model,product.date,product.harddisk,product.ram,product.damage,product.driver,product.status from product INNER JOIN costomer
ON costomer.cid=product.cid WHERE id LIKE '%".$term."%'
OR name LIKE '%".$term."%',
OR pname LIKE '%".$term."%',
OR model LIKE '%".$term."%',
OR statusLIKE '%".$term."%',";
$r_query = mysql_query($sql);
?>
<?php
while ($row = mysql_fetch_array($r_query)){
echo '<tr><td>' .$row['id'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>' .$row['pname'].'-'.$row['model'].'</td>';
echo '<td>'.$row['mobile'].'</td>';
echo '<td>'.$row['status'].'</td>';
}
echo '</tr>';
}
?>