Попытка добавить поля формы пользовательских настроек в базу данных, но возникли проблемы

У меня есть форма, в которой пользователи будут определять свои пользовательские настройки для настраиваемого приложения, которое я создаю. Этот проект познакомил меня с stmt, и мне пришлось познакомиться с mysqli.

В настоящее время я отправляю форму с несколькими опциями. Случайное эхо, которое я получаю из моего кода, выводится на экран (для тестирования), но когда я проверяю базу данных, вставляется только одна из опций (GmailID).

Сообщение об ошибке на экране гласит:

Предупреждение: mysqli_stmt :: bind_param (): количество переменных не соответствует количеству параметров в подготовленном выражении в /home/website/public_html/portal/includes/process-user-settings.php в строке 56

Однако, просматривая мой код, я вижу, что у меня правильное количество переменных и параметров. Как я уже сказал, он работает для GmailID, но не работает для GmailPW и не уверен, что эта ошибка где-то связана? Я включаю свой файл кода на всякий случай.

error_reporting(-1);
ini_set('display_errors', 'On');

echo 'Houston we are a go<br />';
if (isset($_GET['GmailID'], $_GET['GmailPW'], $_GET['userID'])) {

include_once 'db_connect.php';
include_once 'psl-config.php';

$error_msg = "";

echo 'Info Set<br />';

$GmailID = filter_input(INPUT_POST, 'GmailID', FILTER_SANITIZE_EMAIL);
$GmailID = filter_var($GmailID, FILTER_VALIDATE_EMAIL);

$GmailPW = filter_input(INPUT_POST, 'GmailPW', FILTER_SANITIZE_STRING);

if (empty($error_msg)) {
echo 'No Errors<br />';
// Create a random salt
$random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));
echo $random_salt . '<br />';

// Create salted password
$GmailPW = hash('sha512', $GmailPW . $random_salt);
echo $GmailPW . '<br />';

$user_id = $_GET['userID'];

/* OPTIONS */
$options = array(
'GmailID' => $GmailID,
'GmailPW' => $GmailPW
);

foreach($options as $key => $value) {
echo 'Made it to the Foreach <br />';
// Insert the options into the database
if ($insert_stmt = $mysqli->prepare("INSERT INTO user_settings (user_id, meta_key, meta_value, salt) VALUES ('$user_id', '$key', '$value', ?)")) {
$insert_stmt->bind_param('ssss', $user_id, $key, $value, $random_salt);
// Execute the prepared query.
if (! $insert_stmt->execute()) {
header('Location: ../index.php?err=insert');
exit();
}
}
echo ' We are done';
header('Location: ../index.php?user=success');
exit();
}
}
}

1

Решение

Ваш запрос совершенно неправильный для использования заполнителей:

INSERT [...snip...] ('$user_id', '$key', '$value', ?)")) {
^---one single placeholder

У вас точно ОДИН заполнитель в вашем запросе и 3 непосредственно вставленные переменные, что означает, что вы открыты для атак с использованием SQL-инъекций.

Так должно быть

INSERT [...snip...] (?, ?, ?, ?)
1

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

Вот что сработало для меня, надеюсь, это поможет кому-то еще =)

$options = array(
'GmailID' => $GmailID,
'GmailPW' => $GmailPW,
'WebmailID' => $WebmailID,
'WebmailPW' => $WebmailPW,
'ProfileIMG' => $ProfileIMG
);

foreach($options as $key => $value) {

// Insert the options into the database
if ($insert_stmt = $mysqli->prepare("INSERT INTO user_settings (user_id, meta_key, meta_value, salt) VALUES (?, ?, ?, ?)")) {
$insert_stmt->bind_param('ssss', $user_id, $key, $value, $random_salt);
// Execute the prepared query.
if (! $insert_stmt->execute()) {
header('Location: ../index.php?err=insert');
exit();
}
}

//Success
header('Location: ../index.php?user=success');
exit();
}
1

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