我有一个包含作业号字段(jobno)的表。此字段包含的数据类似于' 123456'或者它看起来像' 345678 Acme'。该网站的用户将键入对作业号的请求。使用简单的SELECT - WHERE - LIKE命令搜索和返回所需数据没有问题。我的问题是,用户希望现在能够在他们的请求字段中输入多个作业号码。即:123456,345678。等等。
我将如何为此创建选择?我理解使用" WHERE jobno IN"并且此方法适用于仅为数字的作业号。但是,这不允许使用通配符,因此我无法返回诸如' 345678 Acme'之类的数据。另外,我不能使用一系列" OR"因为我不知道用户可以输入多少个工作号码来搜索。
我希望这是足够的解释。任何帮助都会很棒。谢谢!
答案 0 :(得分:0)
您应首先爆炸用户的输入。 然后,您可以选择不同的选项,可以为每个数字运行查询,然后将所有生成的行添加到数组中(您可以获得重复的结果),或者您可以动态构建查询。 / p>
示例:
// Input $_POST['jobNo'] = '123,1234,abc,abcde'
$str = $_POST['jobNo'];
$pieces = explode(',',$str); // returns array("123","1234","abc","abcd")
$sql = "SELECT * FROM table WHERE (";
$i = 0;
foreach( $pieces as $piece )
{
if( $i !== 0 )
$sql .= 'OR ';
$sql .= "column LIKE '%". $piece ."%' ";
$i++;
}
if( $i === 0 )
$sql .= "1 = 1";
$sql .= ")";
// $sql = SELECT * FROM table WHERE (column LIKE '%123%' OR column LIKE '%1234%' OR column LIKE '%abc%' OR column LIKE '%abcd%')
答案 1 :(得分:0)
你可以这样做:
$jobs = "1234, 4567, 89abc"; //input string of jobno's
$jobs = array_map(function($value) {
return "jobno LIKE '%" . trim($value) . "%'";
}, explode(",", $jobs));
$condition = implode(" OR ", $jobs);
// condition will be:
// "jobno LIKE '%1234%' OR jobno LIKE '%4567%' OR jobno LIKE '%89abc%'
答案 2 :(得分:0)
选项1:查询中的动态OR:
$searchTerms = mysqli_real_escape_string($conn, $_POST['search']);
$where = [];
foreach (explode(",", $searchTerms) as $term) {
$where[] = "job = '".trim($term)."'";
}
$query = "SELECT * FROM jobs WHERE ".implode(" OR ", $where);
// => SELECT * FROM jobs WHERE job = '123456' OR job = '345678 Acme'
选项2:Regexp
$searchTerms = mysqli_real_escape_string($conn, $_POST['search']);
$where = array_map("trim", explode(",", $searchTerms));
$query = "SELECT * FROM jobs WHERE job REGEXP '^(".implode("|", $where).")$'";
// => SELECT * FROM jobs WHERE job REGEXP '^(123456|345678 Acme)$'
根据需要调整完全匹配或松散匹配