0

我在查询中有一个 Like 条件,我需要过滤用户表中的名字和姓氏。我的变量设置如下:

$firstname = Input::get('firstname');
$lastname = Input::get('lastname');
$myparameters = array();
$filterfirst = "'%" . $firstname . "%'";
$filterlast = "'%" . $lastname . "%'";

我的 sql 查询是这样设置的(动态):

$sqlstring = 
                    "SELECT t1.id,t1.first_name, t1.last_name, t2.function "
                    . "FROM users t1 JOIN user_details t2 "
                    . "ON t1.id = t2.user_id";
            if($firstname && $lastname){
                $sqlstring .= " WHERE lower(first_name) LIKE lower(?)"
                        . " OR lower(last_name) LIKE lower(?)";
                $myparameters = [$filterfirst,$filterlast];
            }
            else{
                if($firstname){
                    $sqlstring .= " WHERE lower(first_name) LIKE lower(?)";
                    $myparameters = [$filterfirst];
                }
                if($lastname){
                    $sqlstring .= " WHERE lower(last_name) LIKE lower(?)";
                    $myparameters = [$filterlast];
                }
            }

我的查询正在使用 Laravel 准备好的语句执行:

$resultset = DB::select($sqlstring,$myparameters);

我已经记录了我的重要变量的值,如下所示:

Log::info($sqlstring);
Log::info($myparameters);
Log::info('first name: ' . $filterfirst);
Log::info('last name: ' . $filterlast);

我看到我的记录值是这样的:

[2015-06-26 09:32:52] local.INFO: SELECT t1.id,t1.first_name, t1.last_name, t2.function FROM users t1 JOIN user_details t2 ON t1.id = t2.user_id WHERE lower(first_name) LIKE lower(?) OR lower(last_name) LIKE lower(?)  
[2015-06-26 09:32:52] local.INFO: array (
  0 => '\'%jer%\'',
  1 => '\'%can%\'',
)  
[2015-06-26 09:32:52] local.INFO: first name: '%jer%'  
[2015-06-26 09:32:52] local.INFO: last name: '%can%'  

所以我的值是正确的 '%jer%' 和 '%can%' 这是我需要进入查询的值,但是当我将它们放入我的变量数组时,它们变成了 '\'%jer%\'' 和'\'%can%\'' 所以正在执行的 sql 命令不能正常工作(什么都不返回)。

有谁知道我该如何解决这个问题?所以我需要数组包含带有单引号的字符串而不添加额外的单引号或斜杠,所以我只需要 '%whateverIgavein%'

编辑:尝试在我的 sql 语句中使用键值数组和命名变量,但表面上没有任何区别(一旦它进入数组,它就会变成 '\'%whateverIgavein%\''

4

1 回答 1

1

您犯了在变量内容中添加引号的错误:

$firstname = "Joe";
$filterfirst = "'%" . $firstname . "%'";
var_dump($filterfirst) //string(7) "'%Joe%'" <-- notice the extra quotes

仅包含所需%的字符串:

$filterfirst = "%{$firstname}%";

或者

$filterfirst = "%" . $firstname . "%";

都会导致string(5) "%Joe%"

于 2015-06-26T15:52:23.727 回答