Ajax/PHP/MySQL: вставка данных в БД не работает с Ajax и PHP

Я новичок в PHP и MySQL и ищу помощи в следующем.

Я хотел бы сохранить электронную почту пользователя и выбранный язык в базе данных при нажатии кнопки.
Я подумал, что могу использовать для этого Ajax, поэтому я поместил приведенный ниже вызов Ajax в свой файл функций JS, чтобы передать данные в отдельный файл Ajax (ajax.php), который затем вставит их в БД ("Users").

Когда я предупреждаю значения в JS, они отображаются правильно, поэтому мои входные переменные в порядке, а также вызов Ajax возвращает «success» после передачи данных, но я не могу заставить это что-либо вставить в мою базу данных.
Когда я запускаю тот же INSERT вручную в базе данных, он работает нормально.

Может кто-нибудь сказать мне, что я делаю неправильно здесь?

Мой вызов Ajax (в моем файле функций):

$('#btnID').on('click', function(){
    var email = $.trim( $('#email').val() ).toLowerCase();
    var lang = $.trim( $('#lang').val() );

    $.ajax({
        url: "ajax.php",
        type: "post",
        cache: "false",
        data: {
            email: email,
            lang: lang
        },
        success: function(data) {
            console.log(data);
            alert("success");
        },
        error: function(){
            alert("failure");
        }
    });
});

Мой PHP (в моем файле ajax.php):

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$lang = $_POST["lang"]; 
$sql = "INSERT INTO Users (email, lang) VALUES ('" . $email . "', '" . $lang . "')";
$conn->close();

Заранее большое спасибо, Майк


person keewee279    schedule 21.06.2015    source источник


Ответы (2)


Вы просто готовите запрос, а не запускаете его.

$conn->query($sql)

Итак, у вас должно быть что-то вроде

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$lang = $_POST["lang"]; 
$sql = "INSERT INTO Users (email, lang) VALUES ('" . $email . "', '" . $lang . "')";
if ($conn->query($sql)) 
{ 
echo 'success'; 
} 
else 
{ 
echo 'failure'; 
}
$conn->close();

Предупреждение:

  1. Вы не дезинфицируете свой ввод (никогда не доверяйте своему вводу)

  2. Вы должны предпочесть Подготовленные операторы PDO, чтобы сделать его лучше

Обновление:

Поскольку ОП должен знать больше об очистке ввода

Доступны несколько шагов или подходов

  1. Если вы получаете целое число в качестве входных данных, сделайте его целым.
$id = $_GET['id'];
settype($id, 'integer');
  1. Используйте mysql_real_escape_string() для экранирования функции для переменных запроса

  2. Используйте strip_tags(), чтобы удалить нежелательный html

  3. Если у вас есть встроенная строка, выполните htmlspecialchars.

  4. Входными данными может быть команда оболочки для разрыва всего escapeshellcmd

person Sulthan Allaudeen    schedule 21.06.2015
comment
Большое спасибо. Это прекрасно работает! Можешь объяснить, что ты имеешь в виду под уборкой? - person keewee279; 21.06.2015
comment
Не за что.. Это значит санировать. Вы можете сделать это, экранируя , фильтрация и т. д., - person Sulthan Allaudeen; 21.06.2015
comment
Спасибо. Я думал, $.trim здесь будет достаточно? Я только начал программировать, не могли бы вы дать мне несколько примеров или типичный подход для этого? Я проверяю ввод электронной почты отдельно при отправке этого (просто не добавлял это здесь). - person keewee279; 21.06.2015
comment
Конечно ... Обновление моего ответа :) - person Sulthan Allaudeen; 21.06.2015
comment
Понял - большое спасибо, это здорово и действительно полезно! Обязательно применю и приму ответ, как только смогу. :) - person keewee279; 21.06.2015
comment
Добро пожаловать. +1 за ваше рвение по поводу очистки ввода :) - person Sulthan Allaudeen; 21.06.2015
comment
Спасибо. Я подумал, что если я выучу это, мне лучше начать с самого начала. :) - person keewee279; 21.06.2015
comment
Спасибо. Извините, я думал, что это работает, но смотрел не на то. Кажется, он все еще не делает вставку. Есть ли что-то еще, что может отсутствовать здесь, может быть, на стороне SQL? - person keewee279; 21.06.2015
comment
Все в порядке, можете ли вы сделать echo $sql и поместить его в phpmyadmin и посмотреть, что произойдет? - person Sulthan Allaudeen; 21.06.2015
comment
Большое спасибо, мне очень жаль. У меня есть PHP, сохраненный в отдельном файле с именем ajax.php. В настоящее время там больше ничего нет, так как это для тестирования. Где бы я тогда повторил $sql? - person keewee279; 21.06.2015
comment
Давайте продолжим обсуждение в чате. - person Sulthan Allaudeen; 21.06.2015
comment
Как обсуждалось в чате, теперь он работает с вашими обновленными решениями - большое спасибо за это! - person keewee279; 21.06.2015
comment
Не за что, также не забудьте удалить предупреждение в функции ajax :) Потому что он будет печатать или предупреждать запрос или успех каждый раз - person Sulthan Allaudeen; 21.06.2015
comment
Обязательно - так и сделаю. :) - person keewee279; 21.06.2015
comment
Конечно, если у вас возникнут проблемы, вы должны пинговать меня в любое время;) - person Sulthan Allaudeen; 21.06.2015
comment
Я обязательно это сделаю - еще раз спасибо за вашу помощь! Я уверен, что скоро наткнусь на следующий вопрос. ;-) - person keewee279; 21.06.2015

Вы на самом деле ничего не вставляете. Для этого вам нужно вызвать $conn->query($sql) после создания вашего SQL.

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$lang = $_POST["lang"]; 
$sql = "INSERT INTO Users (email, lang) VALUES ('" . $email . "', '" .      $lang . "')";
$conn->query($sql); //check the return value here and do what you want
$conn->close();
person crnlx    schedule 21.06.2015
comment
Спасибо и за это! - person keewee279; 21.06.2015