【问题标题】:PHP script insert multiples records after submit button [duplicate]PHP脚本在提交按钮后插入多条记录[重复]
【发布时间】:2020-07-20 21:26:56
【问题描述】:

我正在创建一个 HTML 表单,以使用相同的 php 脚本在各自的表中插入输入和文件值来执行此操作。当我填写输入文本并选择图像以将所有它们的路径发送到表格时,php脚本会根据我选择发送的图像数量在一个表格中插入几行,这是不正确的,因为表格只需要存储一条记录,另一张表必须存储具有最近创建的 ID 的图像名称。

我发现了一些类似的问题,但我没有找到解决这个问题的正确方法:

  1. PHP multiple records insert
  2. MYSQL Insert Submit Button PHP
  3. PHP multiple records insert
  4. how to insert multiple records in php

在这种情况下,我在 Mysql 上有 2 个表:cars_tbl e images_tbl。以下是它们的结构:

cars_tbl

carID | carName
--------------------
01    | Volvo
02    | GM
03    | Ford
xx    | xxxxxxxxxx

images_tbl

imageID | image       | carID
-------------------------------
01      | 0001.jpg    | 01
02      | 0551.jpg    | 01
03      | 08591.jpg   | 02
04      | 074581.jpg  | 02
05      | 785581.jpg  | 03

On table images_tbl,*carID 列,是 cars_tbl 的 ID 列的外键。

以下是我为此使用的基本 HTML 表单代码:

<form action="upload.php" method="post" enctype="multipart/form-data">

<label for="carName">Car Name:</label><br>
  <input type="text" id="carName" name="carName"><br>

<label for="image">Select images:</label><br>
<input type="file" id="file" name="file" multiple>

 <input type="submit" name="submit" value="ADD">

</form>

最后,PHP 脚本 (upload.php) 具有插入 carName 输入到 cars_tbl 表并插入到images_tbl 表上的图像名称和汽车 ID:

<?php

include 'configDB.php';

// prepare and bind
$stmt = $db->prepare("INSERT INTO cars_tbl (carName) VALUES (?)");
$stmt->bind_param("s", $carName);

// set parameters and execute
$carName = $_POST['carName'];
$stmt->execute();
$stmt->close();

$last_id = $db->insert_id;

if(!empty($_FILES)){

    // File path configuration 
    $uploadDir = "uploads/"; 
    $fileName = basename($_FILES['file']['name']); 
    $uploadFilePath = $uploadDir.$fileName; 

    // Upload file to server 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadFilePath)){ 
        // Insert file information in the database 
        $insert = $db->query("INSERT INTO images_tbl (image, carID) VALUES ('".$fileName."', '".$last_id."')"); 
    } 
        echo "Car added. ID: .$last_id.";

$db->close();

}

?>

根据以上信息,当我填写输入表单carName并在文件输入中选择图像时,点击提交按钮后,php脚本(upload.php ) 将所选图像正确上传到 uploads 文件夹,但在 cars_tbl 表上,脚本会根据我发送的图像数量添加几行,同时脚本将图像名称添加到 images_tbl 表中,但 carID 列不仅是所有添加图像的唯一 ID,而且 carID 位于序列号上,而不是最近从 cars_tbl 创建的 ID > 表。

更新

我希望发生的结果类似于下表:

假设我用 BMW 名称填充 carName 输入,然后单击文件浏览器按钮选择 3 张图像,然后单击提交按钮。 php 脚本应将数据插入到 2 个表 cars_tblimages_tbl 中,如下所示:

cars_tbl 表格

carID | carName
--------------------
xx    | xxxxx
xx    | xxxxx
xx    | xxxxx
04    | BMW

images_tbl 表格

imageID | image       | carID
-------------------------------
xx      | xxxxxxxx    | xx
xx      | xxxxxxxx    | xx
xx      | xxxxxxxx    | xx
05      | 782221.jpg  | 04
06      | 711581.jpg  | 04
07      | we3444.jpg  | 04

在这种情况下,我必须修改我的脚本(upload.php)以插入,点击提交按钮后,只有一个注册到 cars_tbl 表和将所选图像名称放入与最近创建的汽车 ID 相关的 images_tbl 表中?

【问题讨论】:

  • 禁用提交按钮,避免双击或多次点击,导致多次提交表单
  • 您是否有任何触发器或其他过程在此表上添加 SQL 行?
  • multiple 不是&lt;form 标记中的有效或有用属性
  • 您的 PHP 代码看起来像是一次上传一张图片,但您对问题的措辞表明您一次上传多张图片,您能澄清一下吗?
  • 并且永远让您的网络应用程序以 root 身份登录数据库。 Root 可以为所欲为,因此除了 SQL 注入漏洞之外,这只会让您的数据库成为一本可供黑客使用的开放书。而是专门为此应用程序创建一个单独的用户帐户,该帐户仅具有它实际需要才能正常工作的权限。甚至不要在开发或测试期间使用 root 帐户作为快捷方式,因为您还需要测试您的帐户权限 - 否则当您上线时,您可能会遇到与用户帐户设置相关的意外错误。

标签: php mysql


【解决方案1】:

您的 PHP 代码看起来是一次上传一张图片,但您的 HTML 表单接受多张图片。

在本期中$_FILES标签的结构将完全不同,这两种$_FILES之间不可转移。


作为一般惯例,您应该将add a CSRF token 发送到您的POSTing 表单,这也将避免这种重复,该表单可以提交多次,但只会在第一次被接受。

所以你的表单会有一个唯一的令牌&lt;input type='hidden' name='randomName' value='&lt;?php print $_SESSION['randomValueEachPageLoad'];?&gt;'&gt;

然后,在您的接收页面上,您执行以下操作:

if($_POST['randomName'] === $_SESSION['randomValueEachPageLoad']){
    // Do all of your stuff with the form data.
}
unset($_SESSION['randomValueEachPageLoad']);

作为noted by ADyson,从您的&lt;form&gt; 元素中删除multiple


作为also mentioned by ADyson,您正在以root 用户身份登录SQL,这是非常不明智的,并且存在重大安全风险;如果有人可以访问您的 PHP 甚至将他们自己的数据发布到您的表单(因为您没有 CSRF 保护或通用参数化查询),那么他们可以用您的 SQL 做任何事情......

【讨论】:

  • 感谢您的反馈。因此,上面 php 脚本中的数据库连接配置只是一个示例。我的 connectiong 配置文件是另一个。我在
    中放入的 multiple 标记我没有看到并且是一个错误,因此我将其删除。一般来说,我想编辑我的脚本以同时插入到 cars_tbl 和 images_tbl 中。在这种情况下,一个记录到 cars_tbl 中,一个或多个图像名称到 images_tbl 中。感谢您的提示。
猜你喜欢
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2012-05-18
  • 1970-01-01
  • 2015-04-27
相关资源
最近更新 更多