Я пытаюсь использовать уточняющие инструменты для поиска на моем сайте. Бит, с которым я застрял, — это поиск по начальной букве. Например, я мог бы использовать подстановочный знак «% X%», но он вернул бы все, что содержало букву «х».
Я читал на нескольких сайтах, что SUBSTRING можно использовать в запросах MySQL
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
}
}
Первая часть функции в порядке, она получает массив идентификаторов, которые затем помещаются вместе в виде строки SQL. SQL не возвращает результаты, потому что SUBSTRING не поддерживается таким образом?
Если это так, есть ли способ создания запроса, подобного этому, или было бы проще извлечь все результаты из базы данных, а затем проверить их в другой функции?
У вас есть две проблемы с этим выражением:
SUBSTRING('first_name', 0, 1) = :".$x.$x;
Первый, substr()
в SQL (в общем случае) начинает считать с 1, а не с 0. Итак, первый аргумент должен быть 1.
Во-вторых, у вас есть первый аргумент в одинарных кавычках. Так что, в лучшем случае, это вернет письмо 'f'
, Вот простое правило: используйте только одинарные кавычки для строковых и констант даты. Никогда не используйте одинарные кавычки для ссылки на имена столбцов.
Есть несколько способов написать то, что вы хотите. Вот три:
SUBSTRING(first_name, 1, 1) = $x
LEFT(first_name, 1) = $x
first_name like '$x%'
Ваш запрос может быть значительно упрощен с ЛАЙК оператор. Это:
"AND SUBSTRING('first_name',0,1) = :".$x.$x;
может стать таким:
"AND first_name LIKE '".$x.$x."%'";
Я не уверен, что $x.$x
для, поэтому я просто оставил его в иллюстративных целях.