【发布时间】:2020-07-20 21:26:56
【问题描述】:
我正在创建一个 HTML 表单,以使用相同的 php 脚本在各自的表中插入输入和文件值来执行此操作。当我填写输入文本并选择图像以将所有它们的路径发送到表格时,php脚本会根据我选择发送的图像数量在一个表格中插入几行,这是不正确的,因为表格只需要存储一条记录,另一张表必须存储具有最近创建的 ID 的图像名称。
我发现了一些类似的问题,但我没有找到解决这个问题的正确方法:
- PHP multiple records insert
- MYSQL Insert Submit Button PHP
- PHP multiple records insert
- 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_tbl 和 images_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不是<form标记中的有效或有用属性 -
您的 PHP 代码看起来像是一次上传一张图片,但您对问题的措辞表明您一次上传多张图片,您能澄清一下吗?
-
并且永远让您的网络应用程序以 root 身份登录数据库。 Root 可以为所欲为,因此除了 SQL 注入漏洞之外,这只会让您的数据库成为一本可供黑客使用的开放书。而是专门为此应用程序创建一个单独的用户帐户,该帐户仅具有它实际需要才能正常工作的权限。甚至不要在开发或测试期间使用 root 帐户作为快捷方式,因为您还需要测试您的帐户权限 - 否则当您上线时,您可能会遇到与用户帐户设置相关的意外错误。