Ajax / PHP / MySQL:将数据插入到数据库中但无法使用 Ajax 和 PHP

Ajax / PHP / MySQL: Inserting data into db not working with Ajax and PHP

我是 PHP 和 MySQL 的新手,正在寻求以下方面的帮助。

我想在单击按钮时将用户电子邮件和所选语言存储在数据库中
我的想法是我可以为此使用 Ajax 所以我将下面的 Ajax 调用放在我的 JS 函数文件中以将数据传递到单独的 Ajax 文件(ajax.php)然后将其插入数据库(“Users”)。

当我提醒 JS 中的值时,它们显示正确,因此我的输入变量正常,而且 Ajax 在传递数据后调用 returns“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();

非常感谢, 麦克

你实际上并没有插入任何东西。为此,您需要在构建 SQL.

后调用 $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 . "')";
$conn->query($sql); //check the return value here and do what you want
$conn->close();

您只是在准备查询而不是触发它

$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. 你不是sanitize你的输入(永远不要相信你的输入)

  2. 你应该更喜欢Prepared statements PDO让它变得更好

更新:

因为 OP 需要了解更多关于清理输入的信息

有几个步骤或方法可用

  1. 如果您将整数作为输入,则将其设为整数。
$id = $_GET['id'];
settype($id, 'integer');
  1. 使用mysql_real_escape_string()作为查询变量的转义函数

  2. 使用strip_tags()去掉不需要的html

  3. 如果你有嵌入字符串,那么做htmlspecialchars

  4. 输入可能是 shellcommand 爆裂一切escapeshellcmd