我正在尝试使用精简工具在我的网站上进行搜索。我坚持的位是按开始字母搜索。例如,我可以使用通配符'%X%'但他会归还任何包含字母' x的内容。 我在几个网站上读到可以在mysql查询中使用SUBSTRING
https://stackoverflow.com/questions/6302027
这是我到目前为止所做的一切,但没有任何回报。数据库中的数据应随查询一起返回。
public function refineUsersFollowers($user_id,$q){
if($this->databaseConnection()){
// get the users followers
$state = array(1,2);
$stmt = $this->db_connection->prepare("SELECT * FROM friends WHERE id_2 = :1 AND Friend_Request_State = :2 OR id_2 = :3 AND Friend_Request_State = :4");
$stmt->bindParam(':1', $user_id);
$stmt->bindParam(':2', $state[0]);
$stmt->bindParam(':3', $user_id);
$stmt->bindParam(':4', $state[1]);
$stmt->execute();
// format the SQL OR statements
$sql = '';
$ids = [];
while($rows = $stmt->fetch(\PDO::FETCH_ASSOC)){
array_push($ids,$rows['id_1']);
}
for($x = 0; $x < count($ids); $x++){
if(count($ids) == 1){
//if there is one result
$sql.= ' user_id = :'.$x." AND SUBSTRING('first_name',0,1) = :".$x.$x;
}else if($x == (count($ids) - 1)){
// last entry
$sql.= ' user_id = :'.$x." AND SUBSTRING('first_name',0,1) = :".$x.$x;
}else{
//continue loop
$sql.= ' user_id = :'.$x." AND SUBSTRING('first_name',0,1) = :".$x.$x." OR";
}
}
$stmt = $this->db_connection->prepare("SELECT * FROM account WHERE ".$sql);
for($x = 0; $x < count($ids); $x++){
$stmt->bindParam(':'.$x,$ids[$x]);
$insert = $x.$x.'';
$stmt->bindParam(':'.$insert,$q);
}
$stmt->execute();
$results = $stmt->fetch(\PDO::FETCH_ASSOC);
print_r($results);
// check for followers that start with letter
}
}
函数的第一部分很好,这会得到一个id的数组,然后将它们作为SQL字符串放在一起。 SQL是否未返回结果,因为不支持SUBSTRING? 如果有这样的方法可以产生这样的查询,或者更容易从数据库中提取每个结果,那么在另一个函数中检查它们?
答案 0 :(得分:2)
此表达式有两个问题:
SUBSTRING('first_name', 0, 1) = :".$x.$x;
首先,SQL中的substr()
(一般情况下)从1开始计数而不是0.因此,第一个参数应为1.
其次,你在单引号中有第一个参数。所以,充其量,这将返回字母'f'
。这是一个简单的规则:只对字符串和日期常量使用单引号。切勿使用单引号来引用列名。
有几种方法可以写出你想要的东西。这是三个:
SUBSTRING(first_name, 1, 1) = $x
LEFT(first_name, 1) = $x
first_name like '$x%'
答案 1 :(得分:0)
使用LIKE运算符可以大大简化查询。这样:
"AND SUBSTRING('first_name',0,1) = :".$x.$x;
可以成为:
"AND first_name LIKE '".$x.$x."%'";
我不确定$x.$x
的用途是什么,所以我只是为了说明目的而将其保留下来。