mysql — Использование связывания для формы с большим количеством входов (PHP)

У меня есть форма с большим количеством входов, и я пытаюсь импортировать их в базу данных (MySQL).
Я хочу использовать связывание, но стараюсь избегать записи всех переменных столько раз. Наверное, я не могу объяснить так хорошо, поэтому я приведу здесь код

if(isset($_POST['firstName']) && isset($_POST['lastName']) && isset($_POST['gender'])){

$firstName=trim($_POST['firstName']);
$lastName=trim($_POST['lastName']);
$gender=trim($_POST['gender']);

if(!empty($firstName)&& !empty($lastName)) {
$unos = $db->prepare("INSERT INTO members (firstName,lastName,gender) VALUES (?,?,?)");
$unos->bind_param('sss', $firstName, $lastName, $gender);

if($unos->execute()) {....

1. Ну, это работает нормально, и это не проблема, но теперь я хочу добавить больше входов, поэтому я попробовал это

if(isset($_POST['firstName']) && isset($_POST['lastName']) && isset($_POST['gender'])){

$firstName=trim($_POST['firstName']);
$lastName=trim($_POST['lastName']);
$gender=trim($_POST['gender']);

$param=array('$firstName','$lastName','$gender');
$type='sss';
$param_list = implode(',', $param);

if(!empty($param)) {
$unos = $db->prepare("INSERT INTO members (firstName,lastName,gender) VALUES (?,?,?)");
$unos->bind_param($type,implode(',', $param));

if($unos->execute()) {....

и это не работает. Я получаю «Количество элементов в строке определения типа не совпадает с числом переменных связывания» …
Я не понимаю, потому что когда я повторяю эту вещь взрыва, я получаю то, что мне нужно.
Я довольно новичок в PHP, поэтому помощь будет очень полезна. 🙂

-1

Решение

Вы можете попробовать это:

if(isset($_POST['firstName']) && isset($_POST['lastName']) && isset($_POST['gender'])){

$firstName=trim($_POST['firstName']);
$lastName=trim($_POST['lastName']);
$gender=trim($_POST['gender']);

$param=array('firstName' => 's','lastName' => 's','gender' => 's');

if(!empty($param)) {
$unos = $db->prepare("INSERT INTO members (". implode(',', array_keys($param) .") VALUES (". implode(',', array_fill(0, count($param), '?')) .")");
foreach($param as $paramName => $paramType) {
$unos->bind_param($paramType, $paramName);
}if($unos->execute()) {....

Вы можете добавить столько параметров, чтобы $param массив. Ключ должен содержать имя столбца БД, значение — его тип.

0

Другие решения

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

Как насчет этого? Я попытался заставить весь код опираться на один массив полей. Если вам нужны дополнительные поля, вы можете просто добавить их в массив, а остальная часть кода должна ответить на него. У меня нет подходящей тестовой среды, и я набрал этот код наизусть, так что извините за любые опечатки. 🙂

// The fixes list of allowed/expected fields. Other values are ignored.
$fields = array('firstname', 'lastname', 'gender');

// Check if each value exists, and put them in an array.
$paramvalues = array();
foreach ($fields as $field) do
{
if (!isset($_POST[$field]))
die("missing field $field");

$paramvalues[] = & $_POST[$field]; // Bind_param wants a ref value, hence `&`
}

// Build a list of fields for the dynamic query.
$fieldlist = implode($fields, ',');
// And a list of placeholders.
$paramlist = implode(array_fill(0, count($fields), '?'), ',');
// And a list of types, assuming all parameters are strings.
$paramtypes = str_pad('', count($fields), 's');

// Prepare the query
$unos = $db->prepare("INSERT INTO members ($fieldlist) VALUES ($paramlist)");

// Build an array of reference values to be passed to call_user_func_array:
$paramrefvalues = array();
$paramrefvalues[] = $paramtypes
foreach ($paramvalues as $value) do
{
$paramrefvalues[] = & $value;
}

// Call bind_param using this array of by-ref parameters
call_user_func_array(array($unos, 'bind_param'), $paramrefvalues);

Этот код свободно основан на Эта статья

0

По вопросам рекламы [email protected]