【问题标题】:Pass Data from HTML Form to MySQL Database using PHP使用 PHP 将数据从 HTML 表单传递到 MySQL 数据库
【发布时间】:2014-09-14 22:54:29
【问题描述】:

我正在尝试将一些数据插入到我在本地主机上创建的 mysql 数据库中(使用 wamp 服务器)。但它没有向表中插入任何数据。它也没有显示任何错误消息。另一方面,它显示了我制作的回声。 请帮帮我。我无法在一个页面中键入所有代码,例如this question,因为我正在从一个中间 php 文件重定向到此页面。 这是我写的代码。

<?php
    $con = mysqli_connect("localhost", "root", "11111", "CAR_PARKING_SYSTEM");

    $D_License_No = $_POST['D_License_No'];
    $V_License_No = $_POST['V_License_No'];
    $V_Type = $_POST['vehicle_type'];

    if(!strcmp($V_Type, "four_wheel"))
    {
        $charge = 400;
    }
    else
    {
        $charge = 50;
    }
    $query = "INSERT INTO CUSTOMER_VEHICLE (V_License_No, D_License_No, Arrived_Time, Charge) 
            VALUES ('$V_License_No', '$D_License_No', 'date('H:i')', '$charge')";

    echo "<p>Driver License Number " .$D_License_No. "</p>";
    echo "<p>Vehicle License Plate Number " .$V_License_No. "</p>";
?>

【问题讨论】:

  • $query 变量只是一个字符串......你没有插入任何东西。此外,您不能在字符串中调用函数(date('H:i') 不起作用)。此外,您的代码非常不安全。在未经审查的情况下,您永远不应该使用来自用户的数据。

标签: php mysql database insert forms


【解决方案1】:

这是处理此查询的一种方法:

首先我们创建一个数据库句柄。现在大多数人都使用面向对象的方式来做这件事,所以我们将在这里使用它。

$mysqli = new MySQLi('localhost', 'root', '11111', 'CAR_PARKING_SYSTEM');

然后我们定义 SQL 查询。问号 (?) 是放置值的占位符。

$sql = <<< SQL
    INSERT INTO `CUSTOMER_VEHICLE` (
        `V_License_No`,
        `D_License_No`,
        `Arrived_Time`,
        `Charge`
    ) VALUES (
        ?, ?, ?, ?
    );
SQL;

为了填写占位符,我们需要准备查询。这称为"prepared statement"(或简称“stmt”)。

准备好的语句被发送到数据库,它会检查错误并对其进行优化,以便更快地执行对execute() 方法的连续调用。然而,在这种情况下,我们大多只是使用准备好的语句,以避免恶意输入影响查询。

$stmt = $mysqli->prepare($sql);
if ($stmt === false) {
    die('Could not prepare SQL: '.$mysqli->error);
}

在我们可以使用准备好的语句之前,我们必须有一些方法将值放入占位符中。我们通过binding 一些变量到占位符来做到这一点。在这种情况下,我们将变量$vLicense$dLicense$arrived$charge 绑定到占位符。变量名称可以是任何名称。

$ok = $stmt->bind_param('sssi', $vLicense, $dLicense, $arrived, $charge);
if ($ok === false) {
    die('Could not bind params: '.$stmt->error);
}

现在我们已经将一些变量绑定到占位符上,我们可以开始设置它们的值了。在这种情况下,我们使用filter_input() 函数来清理一些变量的输入。 $charge 变量设置为两个值之一,具体取决于我们处理的车辆类型。

$vLicense = filter_input(INPUT_POST, 'V_License_No', FILTER_SANITIZE_STRING);
$dLicense = filter_input(INPUT_POST, 'D_License_No', FILTER_SANITIZE_STRING);
$arrived  = date('H:i');
if (isset($_POST['vehicle_type']) && $_POST['vehicle_type'] === 'four_wheel') {
    $charge = 50;
} else {
    $charge = 400;
}

值已设置,现在我们可以执行语句了。只需调用语句的execute() 方法即可完成:

if ($stmt->execute() === false) {
    die('Could not execute query: '.$stmt->error);
} else {
    echo '<p>Query executed successfully!</p>';
}
$stmt->close();

我鼓励您阅读MySQLi documentationfilter extension

The full code can be found here.

【讨论】:

  • +1,这个应该是答案,更好的解释:)
【解决方案2】:

您没有插入任何内容,$query 只是一个字符串,您需要将查询传递给 mysqli 函数,另外,最好检查并避免 sql 注入。你的代码应该是这样的:

$mysqli = new mysqli("localhost", "root", "11111", "CAR_PARKING_SYSTEM");

$D_License_No = $_POST['D_License_No'];
$V_License_No = $_POST['V_License_No'];
$V_Type = $_POST['vehicle_type'];
$charge = !strcmp($V_Type, "four_wheel")?400:50;

$query = "insert into CUSTOMER_VEHICLE 
    (`V_License_No`, `D_License_No`, `Arrived_Time`, `Charge`) 
    values(? , ?, ?, ?)"
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ssss",$V_License_No, $D_License_No, date('H:i'), $charge);
if($stmt->execute()){
    //success inserted
    $stmt->close();
    echo "<p>Driver License Number " .$D_License_No. "</p>";
    echo "<p>Vehicle License Plate Number " .$V_License_No. "</p>";
}
else{
    $error = $mysqli->error;
}

【讨论】:

  • @SverriM.Olsen:检查!
【解决方案3】:

您忘记运行查询:

$result = mysqli_query($query);

【讨论】:

  • 您缺少连接 -> $result = mysqli_query($con, $query);
【解决方案4】:

您需要使用一些调试来获得一些错误,以便您可以进一步投资,这就是我构建所述脚本的方式

<?php
try 
{
    $con = mysqli_connect("localhost", "root", "11111", "CAR_PARKING_SYSTEM");

if (empty($con))
{
echo "Mysql failed".mysqli_error();
die; // should always kill script if you dont need it to continue
}

    $D_License_No = $_POST['D_License_No'];
    $V_License_No = $_POST['V_License_No'];
    $V_Type = $_POST['vehicle_type'];

    if(!strcmp($V_Type, "four_wheel"))
    {
        $charge = 400;
    }
    else
    {
        $charge = 50;
    }
    $query = "INSERT INTO CUSTOMER_VEHICLE (V_License_No, D_License_No, Arrived_Time, Charge) 
            VALUES ('$V_License_No', '$D_License_No', 'date('H:i')', '$charge')";

    echo "<p>Driver License Number " .$D_License_No. "</p>";
    echo "<p>Vehicle License Plate Number " .$V_License_No. "</p>";
}
catch (Exception $e)
{
echo $e;
}
?>

对不起,如果我有一些语法错误,我在火车上,而不是最好的编码地点:P

【讨论】:

  • 不。这没有回答问题。
  • 这绝对不能回答问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2016-11-27
  • 2018-07-11
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多