2014-01-17 3 views
0

У меня возникают некоторые проблемы, связанные с тем, как печатать фактические значения из строки, содержащей требуемое значение столбца. У меня есть два php-файла, количество.php и количество-запрос.php, где количество.php имеет форму отправки сообщения, которая перенаправляет через величину-запрос.php для выполнения фактического sql.

количество-запрос открытие PHP:

//-------------------------------------------------------------------------- 
// 1) Connect to mysql database 
//-------------------------------------------------------------------------- 
include 'db-connect-99k.php'; 
$db = new mysqli($host, $user, $pass, $databaseName); 

if($db->connect_errno > 0){ 
    die('Unable to connect to database [' . $db->connect_error . ']'); 
} 

//-------------------------------------------------------------------------- 
// 2) Query database for data 
//-------------------------------------------------------------------------- 
$searchName = $_POST['name']; 
$res = $db->query("SELECT * FROM inventory WHERE name=$searchName"); 

$ searchName устанавливается соответствующим образом из $ _POST (я могу повторить это и печатает правильный входной сигнал от поля формы количества):

<p> Product Name or PPI required (both not required) </p> 
<p>--------------------------------------------------</p> 
<form action="quantity_inquiry.php" method="post"> 
    Product Name: <input type="text" name="name"><br /> 
    PPI: <input type="text" name="ppi"><br /> 
<input type="submit" name="submit" id="submit"> 
</form> 

Другими словами, если я нахожу «автомобиль» в поле формы quantity.php, $ name в количестве-запросе.php выдает «автомобиль» в качестве переменной $ name. Проблема, с которой я сталкиваюсь, заключается в том, что с использованием $ name в качестве моего запроса:

$searchName = $_POST['name']; 
$sql = "SELECT * FROM inventory WHERE name='".$searchName."'"; 
$res = $db->query($sql); 

Я никогда не могу получить фактические значения. Я пытался тонны материала, например:

while($row = $res->fetch_assoc()){ 
    $rowName = $row['name']; 
    $rowPPI = $row['ppi']; 
    $rowQuantity = $row['quantity']; 
    $rowPrice = $row['price']; 
} 

Для установки переменных с последующим

<tr> 
    <td> $rowName </td> 
    <td> $rowPPI </td> 
    <td> $rowQuantity </td> 
    <td> $rowPrice </td} 
</tr> 

ли на самом деле не выбрать поле. Например, если я ЗНАЮ, что у меня есть «product1» в столбце «name» моей таблицы инвентаря, и он задан как «$ searchName», он фактически не выбирает его из таблицы и не выводит его как мое $ rowName, $ rowPPI, $ rowQuantity и $ rowPrice.

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

+0

Как минимум 'WHERE name = $ name' должно быть,' WHERE name = "$ nam e "(вам нужно лучшее предложение для цитирования, но это поможет вам начать работу). И тогда вы, вероятно, также захотите получить данные из своего результата, так что что-то вроде 'while ($ obj = $ res-> fetch_object()) {echo $ obj-> name; } '. – bishop

+0

@bishop Я редактировал свой код. Я пробовал это как, например, $ rowName = $ row-> name ..., но я всегда получаю ошибку в строке 18. Кроме того, мне пришлось конкатрировать имя переменной в конец строки чтобы добавить его в строку, как вы говорили. Спасибо за ваш ввод – zgc7009

ответ

1

Вместо этого

$searchName = $_POST['name']; 
$res = $db->query("SELECT * FROM inventory WHERE name=$searchName"); 

вы должны сделать это

$searchName = $_POST['name']; 
$query = "SELECT * FROM inventory WHERE name = ?"; 
if($stmt = $mysqli->prepare($query)){ 
    $stmt->bind_param('s',$searchName); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 

    while($row = $result->fetch_assoc()){ 
     $rowName = $row['name']; 
     $rowPPI = $row['ppi']; 
     $rowQuantity = $row['quantity']; 
     $rowPrice = $row['price']; 
     ?> 
     <tr> 
      <td><?=$rowName?></td> 
      <td><?=$rowPPI?></td> 
      <td><?=$rowQuantity?></td> 
      <td><?=$rowPrice?></td> 
     </tr> 

     <?php 
    } 

    $stmt->free_result(); 
    $stmt->close(); 
}else die("Failed to prepare!"); 

Или вы можете быть супер фантазии и сделать это:

$query = "SELECT name, pip, quantity, price FROM inventory WHERE name = ?"; 

if($stmt = $mysqli->prepare($query)){ 
    $stmt->bind_param('s', $_POST['name']); 
    $stmt->execute(); 
    $stmt->bind_result($rowName, $rowPPI, $rowQuantity, $rowPrice); 


    while($stmt->fetch()){ 
     ?> 
     <tr> 
      <td><?=$rowName?></td> 
      <td><?=$rowPPI?></td> 
      <td><?=$rowQuantity?></td> 
      <td><?=$rowPrice?></td> 
     </tr> 
     <?php 
    } 

    $stmt->free_result(); 
    $stmt->close(); 
}else die("Failed to prepare!"); 
+0

Лучшее решение, чем мой простой. Шахта работает, но это, очевидно, намного больше. – zgc7009

+0

@ zgc7009 благодарит! Просто заметьте: мое решение защищает вашу базу данных от SQL Injections ... Решение, которое вы разместили, все еще оставляет место для SQL Injection. –

0

Так что я просто слишком долго смотрел на компьютер. Простое решение для немой ошибки. Я оставил

$sql = "SELECT * FROM inventory WHERE name='".$searchName."'"; 

который является правильным, когда я изменил следующее

$rowName -> $row['name']; 

, который был неправильно.Тогда при попытке исправить это я изменил $ SQL для

$sql = "SELECT * FROM inventory WHERE name=$searchName"; 

, который был неправильно, в то время как меняю набор переменных для

$rowName = $row['name']; 

Так Короче говоря, если они были установлены

$sql = "SELECT * FROM inventory WHERE name='".$searchName."'"; 
$rowName = $row['name']; 

Примечание - все переменные $ row * должны быть установлены с = и не ->

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