2014-01-21 2 views
0

Мне нужно отправить несколько идентификаторов строки базы данных на другую страницу, а затем использовать их id для загрузки строк и обработки. Я использовал переменную сеанса, которая работает нормально.запрос с предварительным исправлением не возвращает никаких результатов

$_SESSION['tmp'] = "50,51,52"; 

    if ($stmt = $mysqli->prepare("SELECT id,jpg WHERE id = ?")) { 
     $stmt->bind_param("s",$_SESSION['tmp']); 
     $stmt->execute(); 
     $stmt->store_result(); 
     $stmt->bind_result($result_id,$result_jpg); 
     if ($stmt->num_rows > 0) { 
      while($stmt->fetch()) { 
       $image = array($result_id => $result_jpg); 
       print_r($image."<br />"); 
      } 
     } else { 
      echo "Prepare failed: (" . $stmt->errno . ") " . $stmt->error; 
     } 
    } 

Запрос будет

SELECT id,jpg WHERE id = 50,51,52

, который должен возвращать их все строки, но вместо того, чтобы ничего не отображается на всех, без каких-либо ошибок или что-нибудь. Есть идеи?

###### Редактировать #####

Обновлен мой код:

//Generate the query 
    $query = "SELECT id,jpg FROM images WHERE id IN (?"; 
    for ($i=1; count($_SESSION['tmp']) > $i; $i++) { 
     $query = $query.",?"; 
    } $query = $query.")"; 

    if ($stmt = $mysqli->prepare($query)) { 
     for ($i=1; count($_SESSION['tmp']) > $i; $i++) { 
      $b = $_SESSION['tmp'][$i]-1; 
      $stmt->bind_param("s",$b); 
     } 
     $stmt->execute(); 
     $stmt->store_result(); 
     $stmt->bind_result($result_id,$result_jpg); 
     if ($stmt->num_rows > 0) { 
      while($stmt->fetch()) { 
       $image = array($result_id => $result_jpg); 
       print_r($image); 
      } 
     } else { 
      echo "Prepare failed: (" . $stmt->errno . ") " . $stmt->error; 
     } 
    } 

Не похоже, чтобы сделать зацикливания

bind_param("s",50);

, как получение ошибки:

Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\xampp\htdocs\ppa\add_sales.php on line 39

##### Редактировать 2 #####

Изменено, как это происходит, это отлично работает.

$image = array(); 
    foreach($_SESSION['tmp'] as $x) { 
     if ($stmt = $mysqli->prepare("SELECT id,jpg FROM images WHERE id = ?")) { 
      $stmt->bind_param("s",$x); 
      $stmt->execute(); 
      $stmt->store_result(); 
      $stmt->bind_result($result_id,$result_jpg); 
      if ($stmt->num_rows > 0) { 
       while($stmt->fetch()) { 
        $image[$result_id] = $result_jpg; 
       } 
      } else { 
       echo "Prepare failed: (" . $stmt->errno . ") " . $stmt->error; 
      } 
     } 
    } 
    print_r($image); 
+0

Вы не указали Из какой таблицы выбрать. –

+0

подготовлен, не подготовлен. –

+0

Просмотреть обновленное сообщение –

ответ

2
  1. Вы пропустили FROM дизъюнкцию
  2. Если вы проверили $mysqli->error вы бы знали его сами
  3. WHERE id = 50,51,52 не является допустимым синтаксис MySQL
  4. Вы должны использовать IN оператор вместо
  5. С подготовленными заявлениями он будет оцениваться как WHERE id = '50,51,52'. Вот и все: столбец id сравнивается с одной строкой.
+0

Не могу поверить, что я только что сделал это, как я пропустил ОТ ... спасибо! –

+0

@ Мартин Ли Болл: «ОТ» - это наименьшая проблема, позаботьтесь о других точках – zerkms

1
SELECT id,jpg WHERE id = 50,51,52 

Его неверное утверждение.

1) Вы не можете писать параметры там, где это необходимо. Использование where id = 50 or id = 51 or id = 52

2) вы пропустили FROM: FROM Table

Это правильно:

SELECT id,jpg FROM table WHERE id = 50 or id = 51 or id = 52

+0

Crap! Как я пропустил это! Спасибо –

+0

@Sharikov Vladislav: укажите любое число, равное '50' и' 51' одновременно. – zerkms

+0

@simultaneosly hahah) сначала было правильно: D –

0

Вы можете попробовать что-то вроде: SELECT id,jpg FROM tablename WHERE id IN (50,51,52);

0

Вы должны связать их все по отдельности :

WHERE id IN (?, ?, ?) 

И обязывать:

$stmt->bind_param("i", 50); 
$stmt->bind_param("i", 51); 
$stmt->bind_param("i", 52); 

Вы хотите использовать explode() и цикл, чтобы сделать это правильно. Вам также необходимо будет использовать implode для генерации правильного числа вопросительных знаков:

$questionMarks = '(' . implode(',', array_fill(0, count($resultOfSplit), '?')) . ')'; 
+0

Скобки ..... – zerkms

+0

Упс. Отредактировал его. –

+0

Не буду ли я '$ stmt-> bind_param (" iii ", 50,51,52);' –

Смежные вопросы