Mysql
 sql >> база данни >  >> RDS >> Mysql

Използвайте директивата IN, за да търсите с подготвен оператор

Подготвеният оператор няма параметри, защото сте интерполирали списъка в оператора, преди да го подготвите.

$array=array("item1","item2","item3","item4");
//This is dynamically filled, this is just an example
$in_list = "'".implode("','",$array)."'";//that's why i use implode

$stmt = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements where type IN ('.$in_list.')');

В този момент SQL изразът, който сте създали, е:

SELECT libelle,activite,adresse,tel,lat,lng 
FROM etablissements where type IN ('item1','Item2','Item3','Item4')

Тъй като изразът няма параметри, mysqli_stmt::bind_param не успява. Вместо да интерполирате елементите в израза (което е уязвимо за инжектиране), интерполирайте низ от параметри, след което свържете стойностите (които трябва да се съхраняват отделно).

$array=array("item1","item2","item3","item4");

if (count($in_list) > 0) {
    $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');

    $args = $in_list;
    array_unshift($args, str_repeat('s', count($in_list)));
    call_user_func_array(array($query, 'bind_param'), $args);
    $query->execute();
    $query->bind_result($libelle,$activite,$adresse,$tel,$lat,$lng);
}

Интерфейсът на PDO за обвързване е по-прост.

$array=array("item1","item2","item3","item4");

if (count($in_list) > 0) {
    $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');

    foreach ($in_list as $i => $arg) {
        // query params are 1-based, so add 1 to the index
        // PDO::PARAM_STR is the default type, so no need to pass 3rd arg
        $query->bindValue($i+1, $arg);
    }
    $query->execute();
    // no need to bind the result
}

Всъщност може да бъде още по-просто с PDO, тъй като PDOStatement::execute може да приеме списък със стойности на параметрите:

$array=array("item1","item2","item3","item4");

if (count($in_list) > 0) {
    $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');

    $query->execute($in_list);
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Joomla! 3 инсталация замръзва при създаване на таблица с база данни

  2. LazyInitializationException се опитва да получи мързелив инициализиран екземпляр

  3. Експортирайте MySQL или MariaDB база данни

  4. Защо зареждането на SQLAlchemy обекти през ORM е 5-8 пъти по-бавно от редовете чрез необработен MySQLdb курсор?

  5. Искам легитимен пример за извикване на съхранена процедура C#:MYSQL