2015-02-03 4 views
0

HTML FILE:PHP: Не удается запустить тот же запрос MySQL несколько раз

<form method="post" action="generate.php"> 
Product Reference(s): (if multiple, separate by ",")<br /> 
<input type="text" name="project_ref" value="REF123, REF124" /> 
<input type="submit" value="Generate" /> 
</form> 

PHP FILE:

<?php 

$ref_array = explode(',', $_POST['project_ref']); 

foreach ($ref_array as &$ref) { 

    // Create connection 
    $conn = mysqli_connect($host, $username, $password, $dbname); 
    // Check connection 
    if (!$conn) { 
     die("Connection failed: " . mysqli_connect_error()); 
    } 

    $sql = "SELECT * FROM `inventory` WHERE reference = '$ref' LIMIT 1"; 
    $result = mysqli_query($conn, $sql); 

    if (mysqli_num_rows($result) > 0) { 
     // output data of each row 
     while($row = mysqli_fetch_assoc($result)) { 
      echo "Brand: " . $row["brand"]. "<br>"; 
     } 
    } else { 
     echo "0 results"; 
    } 

    mysqli_close($conn); 

} 

?> 

РЕЗУЛЬТАТЫ:
Марка: Bose
0 Результаты

Но я на самом деле хотел:
Торговая марка: Bose
Торговая марка: Beats

Таким образом, проблема заключается в том, что запрос MySQL не выполняется для каждого элемента массива. Его единственный исполняющий первый элемент массива.

+2

Похоже, что второй код «ref» возвращает нулевые результаты. Возможно, вам нужно ['trim()'] (http://php.net/manual/en/function.trim.php) пробел каждого '$ ref' перед выполнением запроса? Кстати, вам нужно только подключиться к базе данных один раз, а не на каждой итерации цикла. – showdev

+0

Есть ли какая-то конкретная причина, по которой вам необходимо передать ref как '& $ ref'? –

+0

Возможно, это может вам помочь. https://php.net/manual/en/mysqli.multi-query.php – Ciprian

ответ

1

Ваше входное значение имеет пространство между различными рефами: REF123, REF124

Вы можете либо взрываетесь на запятая & пространства:

$ref_array = explode(', ', $_POST['project_ref']); 

Или подрезать значение:

$sql = "SELECT * FROM `inventory` WHERE reference = '" . trim($ref) . "' LIMIT 1"; 

Это также настоятельно рекомендуется передать в $ref как параметр, а не строковый литерал:

http://php.net/manual/en/mysqli-stmt.bind-param.php

0

Похоже, ваш вопрос в вашем взрываются. Первое значение взорвалось правильно, второе (третье, четвертое и т. Д.) Будет иметь ведущее пространство. взорваться на ',' вместо ',' или обрезать результаты перед использованием.

Но в этом коде есть еще несколько вещей. Не создавайте новое соединение для каждого запроса, одно соединение будет работать только для его повторного использования. Во-вторых, используйте параметры или дезинфицируйте значение, прежде чем использовать его в sql, это поможет предотвратить атаки SQL-инъекций, лучший способ - использовать PDO и использовать параметры. Наконец, измените свой запрос так, чтобы один запрос возвращал все результаты, которые вам нужны, используя предложение IN.

<?php 

$ref_array = explode(', ', $_POST['project_ref']); 
$ref_IN = ""; 
foreach ($ref_array as $ref_val) 
    $ref_IN .= "'{$ref_val}', "; 
$ref_IN = rtrim($ref_IN , ","); 

// Create connection 
$conn = mysqli_connect($host, $username, $password, $dbname); 
// Check connection 
if (!$conn) { 
    die("Connection failed: " . mysqli_connect_error()); 
} 

$sql = "SELECT * FROM `inventory` WHERE reference IN ({$ref_IN}) GROUP BY reference"; 
$result = mysqli_query($conn, $sql); 

if (mysqli_num_rows($result) > 0) { 
    // output data of each row 
    while($row = mysqli_fetch_assoc($result)) { 
     echo "Brand: " . $row["brand"]. "<br>"; 
    } 
} else { 
    echo "0 results"; 
} 

mysqli_close($conn); 

?>