2016-01-30 5 views
0

UPDATE:Как вставить несколько данных в базу данных с PHP

Как вставить несколько данных в базу данных? У меня есть таблица с тремя полями. Статус INT 1, id_product VARCHAR 10, и name_product VARCHAR 30. Вот мой код:

<table border='1' cellpadding='2' cellspacing='5'> 
<tr> 
    <th>STATUS</th> 
    <th>PRODUCT ID</th> 
    <th>PRODUCT NAME</th> 
    <th>CHOOSE</th> 
</tr> 

<?php 
    include "connect.php"; 
    $sql = "SELECT * FROM PRODUCT WHERE IDCUSTOMER = $_SESSION[IDCUSTOMER]"; 
    $query = mysql_query($sql); 
    while($result = mysql_fetch_array($query)){ 
    echo"<td><select name='status'><option value='0'>BUY</option> 
    <option value='1'>SELL</option> 
    <option value='2'>LOAN</option> 
    </select></td> 
    <td>$result[id_product]</td> 
    <td>$result[name_product]</td> 
    <td><input type='checkbox' name='check' /></td>"; 
    } 
?> 
</table> 

Данные, которые я хочу, чтобы вставить в базу данных является состояние, id_product и name_product.

Я хочу вставить эти несколько данных, когда установлен флажок. Я не знаю, как их вставить. Надеюсь, кто-нибудь здесь может мне помочь :-). Я действительно ценю любую помощь.

+0

кажется, вы только извлечение информации из база данных. где код, который должен вставлять данные? – RST

+0

Вопрос не ясен. Отсутствие кодов. –

+0

@RST это мой вопрос. как можно вставить эти данные, потому что у него есть несколько данных. Любые предложения – Mike

ответ

2

Это не будет работать - вы бы один select/check параметра за результат, так что вы не можете сказать, где она принадлежит после того, как вы выкладываете (отсутствую) <form>, так как все, что вы получаете один $_REQUEST['check'] со значением on и один $_REQUEST['status'] со значением 0, 1 или 2.

Кроме того, $result[id_product] должен быть {$result['id_product']} и т.д.

Если имя поля ваши, как это, в том числе код продукта, вы будете иметь возможность знать, какой продукт в check и status значения:

$prod_id = $result['id_product']; 
echo " 
    <select name='status-{$prod_id}' ...> 
    <input name='check-{$prod_id}' ...> 
"; 

вы можете обработать их на стороне сервера, как это:

foreach ($_REQUEST as $k => $v) 
    if (preg_match("@^check-(.*)@", $k, $m))  
    { 
     $id_product = $m[1]; 
     $status = $_REQUEST[ "status-$id_product" ]; 
     // your INSERT query... 
    } 

или без preg_match, вы должны проверить, есть ли strpos($k, "check-") === 0 и substr($k, strlen("check-")), чтобы получить идентификатор продукта.

Альтернативные: Массивы

PHP предлагает другой способ передать параметры запроса, так что они в конечном итоге, как массив: вы можете назвать входы a[b], например:

<input name='a[foo]' value='abc'/> 
    <input name='a[bar]' value='def'/> 

Если вы отправите эта форма, а затем

echo "<pre>" . print_r($_REQUEST, 1) . "</pre>"; 

вы увидите

Array 
(
    [a] => Array 
    (
     [foo] => abc 
     [bar] => def 
    ) 
) 

Это означает, что вы можете получить доступ к этим входам в виде массива: $_REQUEST['a']['foo'].

Вы также можете сделать это:

<input name='a[]' value='abc'/> 
    <input name='a[]' value='def'/> 

в этом случае $_REQUEST является

Array 
(
    [a] => Array 
    (
     [0] => abc 
     [1] => def 
    ) 
) 

Форма

Теперь давайте применим это к вашей форме.

Я пользуюсь случаем, чтобы представить вам PDO, так как mysql_query и т. Д. Устарел. Вы можете использовать mysqli, но если вы измените базы данных, вам придется изменить много кода; с PDO вы просто измените строку соединения.

Также целесообразно использовать параметры запроса/привязки параметров. Запрос

"SELECT * FROM PRODUCT WHERE IDCUSTOMER = $_SESSION[IDCUSTOMER]"; 

имеет две взаимосвязанные проблемы: во-первых, должны быть $_SESSION[IDCUSTOMER]{$_SESSION['IDCUSTOMER']}, в противном случае вы получите предупреждение и запрос будет ".. WHERE IDCUSTOMER = " - ошибка синтаксиса. Во-вторых, если $_SESSION['IDCUSTOMER'] не является целым числом, запрос также будет иметь синтаксическую ошибку.

// connect to the database (connect.php) 
$db = new PDO("mysql:host=localhost;dbname=your_db", $dbuser, $dbpass); 

// query for products using ? placeholders for query parameters: 
$sth = $db->prepare("SELECT * FROM PRODUCT WHERE IDCUSTOMER = ?"); 
$sth->execute([ $_SESSION['IDCUSTOMER'] ]); 

while ($row = $sth->fetch()) { 
    $id_product = $result['id_product']; // makes things easier below 
    echo " 
    <tr> 
     <td> 
      <select name='status[$id_product]'> 
      <option value='0'>BUY</option> 
      <option value='1'>SELL</option> 
      <option value='2'>LOAN</option> 
      </select> 
     </td> 
     <td> $id_product </td> 
     <td> {$row['name_product']} </td> 
     <td> <input type='checkbox' name='check[$id_product]' /> </td> 
    "; 
} 

Здесь вы видите, что мы используем foo[bar] обозначения для имен параметров запроса HTTP, а не в foo[] нотации. Это связано с тем, что если мы используем <select name='status[]'> и <input type='checkbox' name='check[]'>, то может случиться так, что count($_REQUEST['status']) != count($_REQUEST['check']), потому что параметр флажка представлен только в том случае, если он установлен, и отсутствует в противном случае.

Это также важно использовать $result['id_product'], а не просто строка-индекс ($i++), потому что порядок и количество строк, которое возвращается запросом может переключаться между генерации <form> и его представления.

Обработка формы

Это очень похоже на ранее foreach ($_REQUEST фрагмент коды, но проще, потому что мы используем foo[bar] синтаксиса для параметров запроса:

$sth = $db->prepare(" 
    INSERT INTO PRODUCTS (id_product, name_product, status, IDCUSTOMER) VALUES (?,?,?,?) 
"); 

foreach ($_REQUEST['check'] as $id_product => $ignore) 
    $sth->execute([ 
     $id_product, 
     $name_product, // TODO 
     $status, 
     $_SESSION['IDCUSTOMER'] 
    ]); 
+0

Этот код работает для чего? Mike

+0

@ Kenney.So, это будет так? foreach ($ _REQUEST as $ k => $ v) if (preg_match ("@^check - (. *) @", $ K, $ m)) { $ id_product = $ m [1]; $ status = $ _REQUEST ["status- $ id_product"]; Вставить в товар (статус, id_product, name_product) значения ($ status, $ id_product, $ name_product) } – Mike

+0

Что-то вроде этого, но откуда происходит '$ name_product'?Что вы пытаетесь сделать точно? Ваша таблица показывает * существующие * продукты, и вы будете добавлять эти продукты в таблицу * снова * - не должны ли вы давать ошибки, когда 'id_product' уникален? Если, например, вы просто хотите обновить эти продукты с новым статусом, вы должны использовать запрос 'UPDATE' (я видел, как другие путались между UPDATE и INSERT, поэтому я просто убедился ...) – Kenney

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