У меня есть форма с большим количеством входов, и я пытаюсь импортировать их в базу данных (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, поэтому помощь будет очень полезна. 🙂
Вы можете попробовать это:
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
массив. Ключ должен содержать имя столбца БД, значение — его тип.
Вам потребуется переменная для каждого вопросительного знака, но вам также нужно будет связать каждый из параметров отдельно. В текущей ситуации вы связываете список значений через запятую как один строковый параметр.
Как насчет этого? Я попытался заставить весь код опираться на один массив полей. Если вам нужны дополнительные поля, вы можете просто добавить их в массив, а остальная часть кода должна ответить на него. У меня нет подходящей тестовой среды, и я набрал этот код наизусть, так что извините за любые опечатки. 🙂
// 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);
Этот код свободно основан на Эта статья