Это не будет работать - вы бы один 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']
]);
кажется, вы только извлечение информации из база данных. где код, который должен вставлять данные? – RST
Вопрос не ясен. Отсутствие кодов. –
@RST это мой вопрос. как можно вставить эти данные, потому что у него есть несколько данных. Любые предложения – Mike