2015-04-24 2 views
0

Привет, У меня это в моей функции PDO, где я хочу проверить 2 столбца моей базы данных с тем же вводом ($ string). Это происходит из моего окна поиска в формате HTML. Я хочу результаты в одном массиве. Однако с помощью этого кода он проверяет только столбец genre, а не столбец name. Но он должен проверять оба столбца. Любая помощь? Благодарю.multiple LIKE не работает в PDO (PHP)

public function search($string){ 
    $question = '%' . $string . '%'; 
    $sql = "SELECT * FROM `products` WHERE `name` OR `genre` LIKE :q"; 
    $stmt = $this->pdo->prepare($sql); 
    $stmt->bindValue(':q', $question); 
    $stmt->execute(); 
    $data = '%$data%'; 
    return $stmt->fetchAll(PDO::FETCH_ASSOC); 
} 

Я получаю эту ошибку, когда я использую этот запрос:

$sql = "SELECT * FROM `products` WHERE `name` like :q OR `genre` LIKE :q"; 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number' in /Applications/MAMP/htdocs/bad/bad/dao/ProductsDAO.php:32 Stack trace: #0 /Applications/MAMP/htdocs/bad/bad/dao/ProductsDAO.php(32): PDOStatement->execute() #1 /Applications/MAMP/htdocs/bad/bad/controller/ProductsController.php(24): ProductsDAO->search('pokemon') #2 [internal function]: ProductsController->index() #3 /Applications/MAMP/htdocs/bad/bad/controller/Controller.php(9): call_user_func(Array) #4 /Applications/MAMP/htdocs/bad/bad/index.php(50): Controller->filter() #5 {main} thrown in /Applications/MAMP/htdocs/bad/bad/dao/ProductsDAO.php on line 32

+0

Ответ Отредактированный, пожалуйста, проверьте изменения. сообщите мне, если у вас есть сомнения или ошибки. – ecarrizo

ответ

2

Ваш запрос не передавая значения ИНЕК, только имя столбца. Также я отредактировал способ передачи параметров для выполнения.

ошибка, что вы переживаете из-за (экстракт Документов):

You must include a unique parameter marker for each value you wish to pass in to the statement when you call PDOStatement::execute(). You cannot use a named parameter marker of the same name twice in a prepared statement. You cannot bind multiple values to a single named parameter in, for example, the IN() clause of an SQL statement.

поэтому я редактировал ответ.

Попробуйте это:

Изменить эти строки:

$sql = "SELECT * FROM `products` WHERE `name` OR `genre` LIKE :q"; 
$stmt->bindValue(':q', $question); 
$stmt->execute(); 

для этого из них:

$sql = "SELECT * FROM `products` WHERE `name` LIKE :name OR `genre` LIKE :genre"; 
$params = array('name' => $question, 'genre' => $question); //or :name and :genre 
$stmt->execute($params); 

если вы все еще получаете ошибки, пожалуйста, посмотрите в документацию он имеет несколько примеры там. PHP PDOStatement::execute Documentation

+0

Это все еще не работает, я все равно получаю ту же ошибку. –

+0

все еще не делает :( –

+0

спасибо за неприятность в любом случае –

1

Попробуйте это:

public function search($string){ 
    $question = "%".$string."%"; 
    $sql = "SELECT * FROM `products` WHERE `name` LIKE :n OR `genre` LIKE :q"; 
    $stmt = $this->pdo->prepare($sql); 
    $stmt->bindValue(':q', $question); 
    $stmt->bindValue(':n', $question); 
    $stmt->execute(); 
    return $stmt->fetchAll(PDO::FETCH_ASSOC); 
} 
+0

Спасибо, что это сработало. Вы только что сохранили мой школьный проект –

+0

ваш прием :-) –