为啥我的 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?的主要内容,如果未能解决你的问题,请参考以下文章