【问题标题】:MySQLi insert, successful database connection but not successfully inserted [duplicate]MySQLi插入,成功的数据库连接但未成功插入[重复]
【发布时间】:2014-12-04 22:47:49
【问题描述】:

我正在尝试使用 mysqli 函数将一些数据插入到表中。

我的连接使用以下方法可以正常工作:

function connectDB(){
    // configuration
    $dbuser     = "root";
    $dbpass     = "";

    // Create connection
    $con=mysqli_connect("localhost",$dbuser,$dbpass,"my_db");

    // Check connection
    if (mysqli_connect_errno()) {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
        return false;
    }else{
        echo '<br />successfully connected<br />';
        return $con;
    }
}

但是当我尝试运行我的插入函数时,我在数据库中什么也没有。

function newUserInsertDB($name,$email,$password){
    $con = connectDB();

    // Prepare password
    $password = hashEncrypt($password);
    echo $password . "<br />";

    // Perform queries 
    mysqli_query($con,"SELECT * FROM users");
    mysqli_query($con,"INSERT INTO users (name,email,password,isActivated) VALUES ($name,$email,$password,0)");

    // insert
    mysqli_close($con); 
}

我一直在查看 mysqli 函数列表以寻找给出错误的正确方法,但它们似乎都是关于与数据库的连接,而不是关于插入的成功(我可以在我的数据库中清楚地看到它没有插入。)

最好的调试方法是什么?我应该为我的插入使用哪种错误处理?

我尝试过使用 mysqli_sqlstate,它给出了42000 的响应,但我在我的语句中看不到任何语法错误。

【问题讨论】:

  • connectDN() ~ mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 中的$con = ... 行上方添加此内容。这使得 mysqli 函数在遇到任何错误时抛出异常。您可能还需要在您的php.ini 文件中设置display_errors = Onerror_reporting = E_ALL,然后重新启动您的网络服务器
  • 另外,阅读这篇关于在 mysqli 中使用准备好的语句的文章。这将帮助您保护您的查询免受 SQL 注入漏洞的影响 ~ php.net/manual/mysqli.quickstart.prepared-statements.php

标签: php mysql mysqli


【解决方案1】:

正如我在评论中提到的,最好使用准备好的语句。比如……

$stmt = $con->prepare(
    'INSERT INTO users (name, email, password, isActivated) VALUES (?, ?, ?, 0)');
$stmt->bind_param('sss', $name, $email, $password);
$stmt->execute();

使用它,您不必担心转义值或为字符串类型提供引号。

总而言之,准备好的语句比尝试将值插入 SQL 字符串更容易也更安全。

我还建议您将 $con 变量传递到您的函数中,而不是在其中创建它。比如……

function newUserInsertDB(mysqli $con, $name, $email, $password) {
    // Prepare password
    $password = hashEncrypt($password);

    // functions that "echo" can cause unwanted side effects
    //echo $password . "<br />";

    // Perform queries 
    $stmt = $con->prepare(
        'INSERT INTO users (name, email, password, isActivated) VALUES (?, ?, ?, 0)');
    $stmt->bind_param('sss', $name, $email, $password);
    return $stmt->execute(); // returns TRUE or FALSE based on the success of the query
}

【讨论】:

    【解决方案2】:

    值周围的 mysql 语句中缺少引号。此外,您应该在将值插入查询之前对其进行转义。这样做:

    mysqli_query($con,"INSERT INTO users (name,email,password,isActivated) VALUES ('".
    mysqli_real_escape_string($con,$name)."','".
    mysqli_real_escape_string($con,$email)."','".
    mysqli_real_escape_string($con,$password)."',0)");
    

    问候

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 2013-04-24
      • 1970-01-01
      • 2016-11-05
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多