在准备好的语句中使用字符串中的单引号
Use single quotes within a string for prepared statement
我在查询中有一个 Like 条件,我需要过滤用户 table 中的名字和姓氏。
我的变量是这样设置的:
$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% \''
您在为变量的内容添加引号时犯了错误:
$firstname = "Joe";
$filterfirst = "'%" . $firstname . "%'";
var_dump($filterfirst) //string(7) "'%Joe%'" <-- notice the extra quotes
要仅将需要的 %
添加到您的字符串中:
$filterfirst = "%{$firstname}%";
或
$filterfirst = "%" . $firstname . "%";
都会导致 string(5) "%Joe%"
我在查询中有一个 Like 条件,我需要过滤用户 table 中的名字和姓氏。 我的变量是这样设置的:
$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% \''
您在为变量的内容添加引号时犯了错误:
$firstname = "Joe";
$filterfirst = "'%" . $firstname . "%'";
var_dump($filterfirst) //string(7) "'%Joe%'" <-- notice the extra quotes
要仅将需要的 %
添加到您的字符串中:
$filterfirst = "%{$firstname}%";
或
$filterfirst = "%" . $firstname . "%";
都会导致 string(5) "%Joe%"