【问题标题】:friend, i have tried to insert data from a HTML form into a Mysql database but it's not working, also unable to find the error朋友,我试图将 HTML 表单中的数据插入 Mysql 数据库,但它不起作用,也找不到错误
【发布时间】:2019-12-14 16:15:28
【问题描述】:

代码中存在某种错误,我无法发现它。与数据库的连接工作正常,我可以验证

这是 HTML 代码 在 HTML 中,我创建了一个表单来将数据插入到数据库中

<!DOCTYPE html>
<html class="html">

    <form method="post" name="Draw" action="form/insertdata.php">

        <input type="date" name="form_fields[date]  " >
        <input type="number" name="form_fields[am113d]" >               

        <input type="number" name="form_fields[am112d]">        
        <input type="number" name="form_fields[am111d]" >               
        <input type="number" name="form_fields[pm13d]" >
        <input type="number" name="form_fields[pm12d]" >
        <input type="number" name="form_fields[pm11d]" >
        <input type="number" name="form_fields[pm53d]" >
        <input type="number" name="form_fields[pm52d]" >
        <input type="number" name="form_fields[pm51d]">
        <input type="number" name="form_fields[pm63d]">
        <input type="number" name="form_fields[pm62d]">
        <input type="number" name="form_fields[pm61d]">
        <input type="number" name="form_fields[pm73d]">
        <input type="number" name="form_fields[pm72d]" >
        <input type="number" name="form_fields[pm71d]" >

        <button type="submit" name="submit">Submit</button>

    </form>
</html>

这是 PHP 代码

这是从 HTML 表单中收集数据并将其存储到 MySql 数据库中的 PHP 代码

*如果我使用此代码,只有一个空行被插入到数据库中,表单中输入的值不会被插入 *

<?php

    include_once 'Configuration.php';

    $Dateee = $_POST['form_fields[date]'];
    $am113d = $_POST['form_fields[am113d]'];
    $am112d = $_POST['form_fields[am112d]'];
    $am111d = $_POST['form_fields[am111d]'];
    $pm13d = $_POST['form_fields[pm13d]'];
    $pm12d = $_POST['form_fields[pm12d]'];
    $pm11d = $_POST['form_fields[pm11d]'];
    $pm53d = $_POST['form_fields[pm53d]'];
    $pm52d = $_POST['form_fields[pm52d]'];
    $pm51d = $_POST['form_fields[pm51d]'];
    $pm63d = $_POST['form_fields[pm63d]'];
    $pm62d = $_POST['form_fields[pm62d]'];
    $pm61d = $_POST['form_fields[pm61d]'];
    $pm73d = $_POST['form_fields[pm73d]'];
    $pm72d = $_POST['form_fields[pm72d]'];
    $pm71d = $_POST['form_fields[pm71d]'];



    $sql = "INSERT INTO `Draw_tabel` 
        (`Date`, `A113d`, `A112d`, `A111d`, `A133d`, `A132d`, `A131d`, `A173d`, `A172d`, `A171d`, `A183d`, `A182d`, `A181d`, `A193d`, `A192d`, `A191d`) 
        VALUES 
        ('$Dateee', '$am113d', '$am112d', '$am111d', '$pm13d', '$pm12d', '$pm11d', '$pm53d', '$pm52d', '$pm51d', '$pm63d', '$pm62d', '$pm61d', '$pm73d', '$pm72d', '$pm71d');";


    if ($conn->query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }

    $conn->close();
?>

数据库

这是创建 MySql 数据库的 SQL 代码

CREATE TABLE `Draw_data`.`Draw_tabel` ( 
    `Date` TEXT NOT NULL , 
    `A113d` TEXT NOT NULL , 
    `A112d` TEXT NOT NULL , 
    `A111d` TEXT NOT NULL , 
    `A133d` TEXT NOT NULL , 
    `A132d` TEXT NOT NULL , 
    `A131d` TEXT NOT NULL , 
    `A173d` TEXT NOT NULL , 
    `A172d` TEXT NOT NULL , 
    `A171d` TEXT NOT NULL , 
    `A183d` TEXT NOT NULL , 
    `A182d` TEXT NOT NULL , 
    `A181d` TEXT NOT NULL , 
    `A193d` TEXT NOT NULL , 
    `A192d` TEXT NOT NULL , 
    `A191d` TEXT NOT NULL 
) ENGINE = MyISAM;

【问题讨论】:

  • 如果您在尝试输入数据库之前var_dump( $_POST ) 会显示正确/预期的数据吗?
  • 危险:你很容易受到SQL injection attacks的影响,你需要defend你自己。

标签: php html mysql


【解决方案1】:

我并不是在提倡这是一种好的做法,但出于演示目的,以显示您的代码有什么问题,我将“按原样”将其放在这里 - 尽管确实应该使用 prepared statement 来完成!!!

表单提交array 如此有效,您在错误级别访问数据。您需要访问在 form_fields 数组中找到的字段,而不是像这样的 POST 数组(当然 form_fields 在 POST 数组中)

为简单起见,此处使用variable variable 语法将各种值作为变量分配

$fields=$_POST['form_fields'];
foreach( $fields as $field => $value )${$field}=$value;

$sql = "INSERT INTO `Draw_tabel` 
    (`Date`, `A113d`, `A112d`, `A111d`, `A133d`, `A132d`, `A131d`, `A173d`, `A172d`, `A171d`, `A183d`, `A182d`, `A181d`, `A193d`, `A192d`, `A191d`) 
    VALUES 
    ('$date', '$am113d', '$am112d', '$am111d', '$pm13d', '$pm12d', '$pm11d', '$pm53d', '$pm52d', '$pm51d', '$pm63d', '$pm62d', '$pm61d', '$pm73d', '$pm72d', '$pm71d');";


echo $sql;

最终呈现的 SQL 如下所示:

INSERT INTO `Draw_tabel` 
    (`Date`, `A113d`, `A112d`, `A111d`, `A133d`, `A132d`, `A131d`, `A173d`, `A172d`, `A171d`, `A183d`, `A182d`, `A181d`, `A193d`, `A192d`, `A191d`) 
VALUES 
    ('2020-12-12', '1', '2', '3', '4', '5', '6', '78', '45', '12', '99', '56', '45', '12', '115', '0');

这里的数字没有意义——只是随机输入的简单整数。


如前所述,更好的方法是使用prepared statement,可以这样做:

if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST['form_fields'] ) ){


    $fields=$_POST['form_fields'];
    $types=array();
    $values=array();

    foreach( $fields as $field => $value ){
        $values[]=$value;
        $types[]=is_numeric( $value ) ? 'i' : 's';
    }


    $sql='insert into `draw_tabel` 
        (`date`, `a113d`, `a112d`, `a111d`, `a133d`, `a132d`, `a131d`, `a173d`, `a172d`, `a171d`, `a183d`, `a182d`, `a181d`, `a193d`, `a192d`, `a191d`) 
        values 
        ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? );';
    $stmt=$conn->prepare( $sql );
    $stmt->bind_param( implode('',$types), ...$values );
    $res=$stmt->execute();

    echo $res ? 'New record created successfully' : 'Error';
}

【讨论】:

  • 类型应始终为字符串。检查值是否为数字可能会导致意外行为。
  • 如果多个类型标识符应该只是字符串,那么它们的意义何在?
  • 极少数情况下您确实希望类型匹配。但是应该根据DB列类型来做,而不是输入类型。
【解决方案2】:

你有:

<input type="date" name="form_fields[date]  " >

$Dateee = $_POST['form_fields[date]'];

但 PHP 会采用该字段名称并将其放入:

$_POST['form_fields']['date']

...您的所有其他字段都有类似的错误。


您还应该use prepared statements with placeholders 而不是将用户输入混入 SQL 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2020-05-14
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多