Вот моя форма ввода -
<input type = "text" multiple name = "name[]">
<input type = "text" multiple name = "mobile[]">
<input type = "text" name = "invoice_no">
Вот php-скрипт для вставки mySQL, который я пробовал:
$name=mysqli_real_escape_string($con, $_POST['name']);
$mobile=mysqli_real_escape_string($con, $_POST['mobile']);
$invoice_no=mysqli_real_escape_string($con, $_POST['invoice_no']);
foreach($mobile as $a => $b){
$sql = "INSERT INTO `customer` (`name`, `mobile`, `invoice_no`)
VALUES('$name[$a]', '$mobile[$a]', '$invoice_no')";
}
if ($con->query($sql) === TRUE) {
echo "Success";
} else {
echo("Error: " . mysqli_error($con));
}
Я пытаюсь вставить массив name [] и mobile [] как отдельную строку вместе с invoice_no, который является фиксированными данными. Как это сделать?
Вы используете mysqli_real_escape_**string**
на $_POST['name']
массиве. вы также запускаете запрос только один раз вне цикла, поэтому фактически будет вставлен только последний. лучше объединить значения для одного запроса
В декларации $sql
замените $mobile[$a]
на ${mobile[$a]}
(то же самое для name
)
Это только вставка последней строки с использованием $ {$ mobile [$ a]}, а также удаление mysqli_real_escape_string
он вставляет только последнюю строку, потому что (как я сказал выше) вы запускаете запрос только один раз вне цикла, а не внутри цикла для каждого элемента массива
Вам нужно ввести экранирование строки в цикл - как указал @smith, mysqli_real_escape_string следует применять к строке, а не к массиву. Кроме того, вы выполняете только запрос, который вставляет один набор значений, а не тот, который вставляет все значения. Таким образом, вы можете либо перевести выполнение запроса в цикл, либо создать запрос, который будет вставлять все строки сразу. Последний наиболее эффективен:
$invoice_no = mysqli_real_escape_string($con, $_POST['invoice_no']);
$sql = "INSERT INTO `customer` (`name`, `mobile`, `invoice_no`) VALUES ";
$values = array();
foreach ($_POST['mobile'] as $key => $value) {
$name = mysqli_real_escape_string($con, $_POST['name'][$key]);
$mobile = mysqli_real_escape_string($con, $value);
$values[] = "('$name', '$mobile', '$invoice_no')";
}
$sql .= implode(',', $values);
if ($con->query($sql) === TRUE) {
echo "Success";
} else {
echo("Error: " . mysqli_error($con));
}
Обратите внимание, что во избежание возможной атаки путем инъекции вам действительно следует использовать подготовленные операторы. См. Руководство по mysqli_prepare, чтобы узнать, как их использовать.
ваша конкатенация запросов немного неправильная, вы не хотите добавлять VALUES
несколько раз, и вам не хватает запятой между каждым набором значений
моя ошибка! отредактировал.