为啥我的 INSERT INTO 方法返回 false?

Posted

技术标签:

【中文标题】为啥我的 INSERT INTO 方法返回 false?【英文标题】:why my INSERT INTO method returns false?为什么我的 INSERT INTO 方法返回 false? 【发布时间】:2015-01-09 22:44:23 【问题描述】:

我正在尝试向我的一个数据库表中插入一些信息。这是我的代码:

function insertUser()
    $con = db_connect();
    $response = array();

    if(empty($_REQUEST['firstname']))
        $fnam = "";
    else
        $fnam = $_REQUEST['firstname'];
    

    if(empty($_REQUEST['lastname']))
        $lnam = "";
    else
        $lnam = $_REQUEST['lastname'];
    

    if(empty($_REQUEST['age']))
        $age = "";
    else
        $age = $_REQUEST['age'];
    

    if(empty($_REQUEST['sex']))
        $sex = "";
    else
        $sex = $_REQUEST['sex'];
    

    if(empty($_REQUEST['location']))
        $loc = "";
    else
        $loc = $_REQUEST['location'];
    

    if(empty($_REQUEST['education']))
        $edu = "";
    else
        $edu = $_REQUEST['education'];
    

   //check if username forgot
    if(empty($_REQUEST['username']))
        $response[] = "Please fill username box";
    else
        $uname = $_REQUEST['username'];
        //check if username is existed
        $isExisted = mysqli_query($con, "SELECT * FROM tbl_users WHERE username = '$uname'");
        if(mysqli_num_rows($isExisted) > 0)
            $response[] = "Username is Existed";
            
         

    //check if password forgot
    if(empty($_REQUEST['password']))
        $response[] = "Please fill password box";
     else
        $pass = $_REQUEST['password'];
    

    if(empty($response))
        //$password = getHash($password);
        $res = mysqli_query($con, "INSERT INTO tbl_users (firstnam, lastname, age, sex, location, education, username, password, created_at) VALUES ('$fnam', '$lnam', '$age', '$sex', '$loc', '$edu', '$uname', '$pass', NOW())");
        // user stored successfully
        if ($res) 
            $response[] = "user stored successfully";
        
    

    echo json_encode($response);
    mysqli_close($con);

这是与我的数据库的连接,我可以使用它来读取数据:

function db_connect()
    $con = mysqli_connect("localhost", "root", "", "ketabha");
    mysqli_set_charset($con, 'utf8');
    if (mysqli_connect_errno()) 
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    

    return $con;

表名和每个列名都是正确的,但它不起作用!当我echo json_encode($res); 它在我的浏览器中显示为假。你能帮帮我吗?

【问题讨论】:

false 表示查询出错。使用echo mysqli_error($con)查看错误信息。 您应该使用or die(mysqli_error($con)) 而不是使用echo json_encode($res); 来获得“真正的”错误。 php.net/manual/en/function.error-reporting.php 也不会受到伤害。 您应该使用bind_param() 而不是变量替换。可能其中一个变量包含引号,导致语法错误。 @Barmar 我按照你说的做了,这是我浏览器中的结果。我输入密码为 jakf\。 Erreur de syntaxe près de ''jakf\', NOW())' à la ligne 1 转义您的数据或更好的是,使用prepared statementsPDO with prepared statements。那将解决它。幸好我懂法语,mais oui mon ami ;) 【参考方案1】:

多个cmet回答以结束问题并标记为已解决:

使用stripslashes()mysqli_real_escape_string() 函数转义您的数据。

更好的是,使用prepared statementsPDO with prepared statements

这是在一段时间内交换的许多 cmets 中的一个,例如您的 created_at 列将作为您的 NOW() MySQL 函数的 DATETIME

另一个是我认为拼写错误的列名,是firstnam,我怀疑是firstname

关于法语错误;这是因为 SQL 的 .ini 文件设置为 lc-messages=fr_FR 之类的东西,需要将其更改为 lc-messages=en_GB,因为您使用的是 Wampserver,因此需要执行此操作才能获取消息英文。

Wamp 的默认语言在其 MySQL 中设置为法语,很奇怪

您应该使用or die(mysqli_error($con)),而不是使用echo json_encode($res);,以获得“真正的”错误。

一旦你的代码没有错误,你就可以重新使用echo json_encode($res);

【讨论】:

没有这个功能我找不到问题,非常感谢你和 Barmar。 @NiloofarHakkaki 一个关于 SQL 注入的小(和幽默)指南:bobby-tables.com 我建议你阅读它以充分理解为什么 Fred 关于使用准备好的语句的建议真的是个好主意

以上是关于为啥我的 INSERT INTO 方法返回 false?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个简单的“INSERT INTO”查询不起作用

为啥会出现“INSERT INTO 语句中的语法错误”?

为啥使用 INSERT INTO VALUES 会出现“输入参数值”?

使用 insert into ... select 会导致 select 附近的语法不正确,为啥?

mysql insert into select 语句为啥会造成死锁

mysql insert into select 语句为啥会造成死锁