【问题标题】:how can I insert data into table php/mysql? [duplicate]如何将数据插入表 php/mysql? [复制]
【发布时间】:2019-12-02 09:14:16
【问题描述】:

我正在做一个测验,一旦成绩计算完成,我想将该数据添加到 test_attempt 表中。

这是它的结构。

查询代码如下:

<?php

            $connection = mysqli_connect("localhost", "root", "", "vartvald");
            if ($connection->connect_error) {
                die("Connection failed:" . $connection->connect_error);
            }

            $user=$_SESSION['user'];
            $userid=$_SESSION['userid'];

            $sql = "INSERT INTO test_attempts (date, id, mark, top_mark, fk_user, fk_test) VALUES
                ('',null,'$grade','$top_grade','$userid','$fk');";

            var_dump($sql);

            $connection->close();
            ?>

我做错了什么?

【问题讨论】:

  • 解释您的代码面临的错误/问题
  • 查询未向表中添加数据
  • date 为空且 $grade、$top_grade、$fk 未定义
  • 您在日期(时间戳)中插入一个空字符串。
  • 你不是在发送sql语句,你需要准备(mysqli_prepare),绑定(mysqli_stmt_bind_param)和执行(mysqli_stmt_execute)。

标签: php mysql mysqli


【解决方案1】:

你的错误很少。您的主要问题是您从未准备过任何查询,也从未执行过它。为此,您需要使用prepare()、bind_param() 和execute()。此外,您没有正确打开 mysqli 连接,并且您的错误检查将永远无法正常工作(请阅读:Should we ever check for mysqli_connect() errors manually?)

修复错误后,您的代码将如下所示:

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$connection = new mysqli("localhost", "root", "", "vartvald");
$connection->set_charset('utf8mb4');

$user = $_SESSION['user'];
$userid = $_SESSION['userid'];

$stmt = $connection->prepare('INSERT INTO test_attempts (date, id, mark, top_mark, fk_user, fk_test) VALUES(NULL,NULL,?,?,?,?)');
$stmt->bind_param('ssss', $grade, $top_grade, $userid, $fk);
$stmt->execute();

我还没有验证您的 SQL 本身是否正确,但是如果您打开了错误报告,PHP 应该会告诉您是否有错误。

【讨论】:

    【解决方案2】:

    您的代码永远不会在数据库中添加数据,因为您没有调用任何插入数据的函数:

     $sql = "INSERT INTO test_attempts (date, id, mark, top_mark, fk_user, fk_test) VALUES
                ('',null,'$grade','$top_grade','$userid','$fk');";
    
    var_dump($sql);
    
    // missed code to insert data in the database
    
    $connection->close(); // here you close the connection
    

    在关闭连接之前,调用mysqli_query:

    mysqli_query($connection,"$sql");
    

    【讨论】:

    • 不要向他们展示如何修复他们不应该使用的东西。向他们展示如何使用准备好的语句来做到这一点。
    • 这是 your 查询正在使用用户输入而不检查其内容。这使您的答案非常不一致-在这里您是说不应该使用这样的代码,而在这里您可以立即编写它,就好像没问题一样
    • @YourCommonSense 我在问题中读错了_POST 而不是_SESSION,所以我从我的答案中删除了警告。谢谢
    • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或MySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough!
    • @Dharman 我知道转义是不够的,必须检查和“准备”所有数据,但在问题中我只能看到 _SESSION 获取数据的位置,因此用户无法更改_SESSION 内容没有访问服务器...因此其他变量可能已经在他的脚本中的某处检查过。所以,我并没有预防性地认为他在这方面是错误的。
    【解决方案3】:

    试试这个:

     $sql = "INSERT INTO test_attempts (date, id, mark, top_mark, fk_user, fk_test) VALUES
                    (CURRENT_TIMESTAMP,null,'$grade','$top_grade','$userid','$fk');";
    

    【讨论】:

      【解决方案4】:

      尝试以下操作,在这里您可以看到 CURRENT_TIMESTAMP 作为 data 的第一个参数传递,并且在 $sql 下方您可以看到 mysqli_query 在这里用来执行插入查询。

      $sql = "INSERT INTO test_attempts (date, id, mark, top_mark, fk_user, fk_test) VALUES
                      (CURRENT_TIMESTAMP,null,'$grade','$top_grade','$userid','$fk');";
      
      mysqli_query($connection, $sql);
      

      【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 2012-05-22
      • 2019-06-17
      • 2018-02-01
      • 2013-07-10
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多