【问题标题】:Post data from html form to mysqli database将数据从 html 表单发布到 mysqli 数据库
【发布时间】:2016-10-22 01:42:54
【问题描述】:

我创建了一个 html 表单,我一直在尝试将用户要填写表单的数据发送到我创建的 mysqli 数据库。 我已经创建了数据库并为表单的 6 个字段创建了 6 个列。 我编写了以下 php 代码来执行这项工作,但它似乎不起作用......

    <?php 
    //get the form elements and store them in variables
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];
    $postal = $_POST['postal'];
    $acceptance = $_POST['acceptance'];

    //establish connection
    $con = mysqli_connect('localhost', 'db_user', 'db_password' , 'db_name', 'db_socket'); 
    //on connection failure, throw an error
    if(!$con) {  
    die('Could not connect: '.mysql_error()); 
    } 

    $sql = 'INSERT INTO db_table1 ( firstname, lastname, email, postal, phone, acceptance ) 
VALUES ( $_POST[firstname], $_POST[lastname], $_POST[email], $_POST[postal], $_POST[phone], $_POST[acceptance] )' ; 

    if ($sql) {
        echo 'Success';
    }
    else {
        die ('Error');
    }

    $mysqli->close();

    //Redirects to the specified page
    header("Location: http://www.example.com/success");
    ?>

你能帮帮我吗?问题出在哪里,没有任何东西进入数据库?

【问题讨论】:

  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug切勿$_POST$_GET 数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。

标签: php mysql forms mysqli


【解决方案1】:

你也可以试试这个

$sql = "INSERT INTO user (username, email, password, avater) "
     . "VALUES ('$username', '$email', '$password', '$avater_path')";

【讨论】:

  • 这是不安全的代码,可能容易受到 SQL 注入的影响。请改用准备好的语句。另外,请以与 OP 相同的方式命名列。
【解决方案2】:

试试这个代码

    $sql = 'INSERT INTO db_table1 ( firstname, lastname, email, postal, phone,acceptance ) VALUES ( "'.$firstname.'","'.$lastname.'","'.$email.'","'.$postal.'","'.$phone.'","'.$acceptance.'", )' ;
    $response= mysqli_query($con,$query);

这会添加mysqli_query。简而言之,您构建了用于查询的字符串,但没有执行实际查询。

【讨论】:

    【解决方案3】:

    您的查询字符串有问题 请注意,在 php 中,如果一个字符串被单引号括起来(就像你所做的那样),它会按原样使用而不插入任何变量

    如果你的字符串包含变量,你应该用双引号括起来

    因此,将单引号替换为双引号,这会将 post 变量包含到您的查询中,并且要对此进行测试,您可以打印 $sql 变量。

    现在虽然代码可以工作,但它不是使用 mysqli 的最佳方式。使用预置查询在 mysqli 中执行查询的标准三个步骤来实际获得 mysqli 的好处,因为直接在查询字符串中使用变量会使您的代码容易受到 Sql Injection 攻击

    【讨论】:

      【解决方案4】:

      这里有很多问题,但最明显的是您将 SQL 查询定义为字符串,测试该字符串是否存在,它显然会存在,然后收工。他们说重要的是思想,但是在编程方面,您必须更加明确。

      您需要真正执行查询。对于mysqli,这是一个多步骤过程:准备、绑定、执行。之后,如果需要,您可以进行提取。一如既往,have the documentation open if you're unfamiliar with how to do all of this。这是理解事物的重要一步。

      将其更新为使用面向对象的表示法使事情更加清晰:

      $con = new mysqli('localhost', 'db_user', 'db_password' , 'db_name', 'db_socket');
      
      $stmt = $con->prepare('INSERT INTO db_table1 (firstname, lastname, email, postal, phone, acceptance) VALUES (?,?,?,?,?,?)');
      
      $stmt->bind_param('ssssss',
        $_POST[firstname], $_POST[lastname],
        $_POST[email], $_POST[postal],
        $_POST[phone], $_POST[acceptance]
      );
      
      $stmt->execute();
      

      不要忘记在 PHP 字符串中使用像 '$this' 这样的单引号不会插入它们的变量,但像 "$this" 这样的双引号会插入变量。这是您原始代码中的另一个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-16
        • 2013-07-29
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-05
        • 2013-02-26
        • 1970-01-01
        相关资源
        最近更新 更多