2015-02-09 3 views
0

У меня есть форма, в которой сотрудники могут вводить детали, которые они заказали, которые затем будут отображаться в списке для просмотра всеми сотрудниками. Это моя форма:Извлечь идентификатор для MySQL INSERT из списка распада раскрывающегося списка

<form method="post" action="../libraries/addpart.php"> 
       <div class="form-group col-lg-4 col-lg-offset-4"> 
        <label for="job_id">Job #</label> 
        <input type="text" class="form-control" name="job_id" placeholder="Job #"> 
       </div> 
       <div class="form-group col-lg-4 col-lg-offset-4"> 
        <label for="part_needed">Part Needed</label> 
        <input type="text" class="form-control" name="part_needed" placeholder="Part Needed"> 
       </div> 
       <div class="form-group col-lg-4 col-lg-offset-4"> 
        <label for="date_ordered">Date Ordered</label> 
        <input type="date" class="form-control" name="date_ordered"> 
       </div> 
       <div class="form-group col-lg-4 col-lg-offset-4"> 
        <label for="vendor_id">Ordered From</label> 
        <select class="form-control" name="vendor_id"> 
         <option></option> 
         <?php 
         while ($row = mysqli_fetch_array($vendors)) { 
          // Print out the contents of the entry 
          echo '<option>' . $row['vendor_name'] . '</option>'; 
         } 
         ?> 
        </select> 
       </div> 
       <div class="form-group col-lg-4 col-lg-offset-4"> 
        <label for="part_needed">ETA</label> 
        <input type="date" class="form-control" name="part_eta"> 
       </div> 
       <button type="submit" class="btn btn-primary col-lg-2 col-lg-offset-5" name="addbutton">Submit</button> 
      </form> 

форма используется выпадающий список, который отображает имена поставщиков, а не их ID, запрашивая из vendors таблицы. Когда форма отправлена, мне нужна запись, которая будет вставлена ​​в таблицу ordered_parts с идентификатором поставщика, а не именем. Это моя (довольно грязная) попытка что:

/* 
* Get Vendor ID 
*/ 
    $vendorname = $_POST['vendor_id']; 

    $query = "SELECT * FROM `vendors` 
     WHERE vendor_name = $vendorname"; 
//Get results 
    $vendorid = $mysqli->query($query) or die($mysqli->error . __LINE__); 

    $job = $_POST['job_id']; 
    $part = $_POST['part_needed']; 
    $date = $_POST['date_ordered']; 
    $vendor = $vendorid['vendor_id']; 
    $eta = $_POST['part_eta']; 


    $partorder = "INSERT INTO `ordered_parts` 
      (job_id, part_needed, date_ordered, vendor_id, part_eta) 
      VALUES 
      ('$job', '$part', '$date', '$vendor', '$eta')"; 

    $result = mysqli_query($mysqli, $partorder); 
    if ($result) { 
     header('Location: ../views/ordered-parts.php'); 
    } else { 
     echo("<br>Failed to add"); 
    } 
} 

Ошибки я получаю:

«У Вас есть ошибка в вашем синтаксисе SQL, проверьте руководство, которое соответствует вашему серверу MySQL версия для правильного синтаксиса «

Как вы, вероятно, можете сказать, у меня не было реального опыта работы с базами данных перед этим проектом. Любые идеи о том, как я могу это сделать?

+0

Попробуйте указать ваше имя переменной кавычками. Я говорю о _ $ vendorname_ в вашем первом запросе. –

+0

Не связанный с вашим вопросом, но вы не должны доверять пользователю и избегать значения _ $ vendorname_, прежде чем использовать его в своем запросе. Для получения дополнительной информации найдите __SQL injection__ –

+0

Отличный совет, спасибо, ребята! –

ответ

0

Подзапрос будет выбивать его в одном заявлении; нет необходимости запрашивать vendors таблицу первый:

INSERT INTO `ordered_parts` 
(job_id, part_needed, date_ordered, part_eta, vendor_id) 
VALUES 
('$job', '$part', '$date', '$eta', SELECT `vendor_id` FROM `vendors` WHERE `vendor_name` = '$vendor') 

Это, как говорится, Р.Х. правильно - строительные запросы таким образом оставляет вас уязвимыми для SQL Injection. Вы можете использовать «параметризованные» запросы mysqli, чтобы избежать этого, или использовать функцию экранирования строк.

+0

Идеально. Спасибо! –

+0

Не могли бы вы отметить его как принятый ответ? – haliphax

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