Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从PHP插入多个MySQL的问题

从PHP插入多个MySQL的问题
EN

Stack Overflow用户
提问于 2014-09-22 23:40:27
回答 4查看 66关注 0票数 0

我正在尝试用一个新的条目更新一张菜肴表,并将它与现有的食材表交叉参照。对于添加的每一道菜,用户需要在多行上分配现有的配料和所需的体积。提交时,应将餐点输入餐桌“菜肴”,并将指定的配料输入“DishIng”链接表。

我的桌子是这样摆的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Table: "Dishes" Columns: DishID, DishName, Serves, etc...
Table: "DishIng" Columns: DishID, IngID, Volume
Table: "Ingredients" Columns: IngID, IngName, Packsize etc...

HTML:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form action="Array.php" method="post">
<ul>
<li>DishID: <input type="text" name="DishID"></li>
<li>Name: <input type="text" name="DishName"></li>
<li>Catagory : <input type="text" name="DishCatID"></li>
<li>Serving: <input type="text" name="Serving"></li>
<li>SRP: <input type="text" name="SRP"></li>
<li>Method : <input type="text" name="Method"></li>
<li>Source : <input type="text" name="SourceID"></li>
<br>
<li>IngID: <input type="text" name="IngID"></li>
<li>Volume: <input type="text" name="Volume"></li>

<li>IngID: <input type="text" name="IngID"></li>
<li>Volume: <input type="text" name="Volume"></li>

<li>IngID: <input type="text" name="IngID"></li>
<li>Volume: <input type="text" name="Volume"></li>

</ul>
<input type="submit">
</form>

任何关于在HTML中动态添加一行成分的建议都是非常欢迎的。

PHP:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

require_once('db_connect.php');

$DishID = mysqli_real_escape_string($con, $_POST['DishID']);
$DishName = mysqli_real_escape_string($con, $_POST['DishName']);
$DishCatID = mysqli_real_escape_string($con, $_POST['DishCatID']);
$Serving = mysqli_real_escape_string($con, $_POST['Serving']);
$SRP = mysqli_real_escape_string($con, $_POST['SRP']);
$Method = mysqli_real_escape_string($con, $_POST['Method']);
$SourceID = mysqli_real_escape_string($con, $_POST['SourceID']);
$IngID = mysqli_real_escape_string($con, $_POST['IngID']);
$Volume = mysqli_real_escape_string($con, $_POST['Volume']);

$array = array('$DishID', '$IngID', '$Volume');


$sql="INSERT INTO Dishes (DishID, DishName, DishCatID, Serving, SRP, Method, SourceID)
VALUES ('$DishID', '$DishName', '$DishCatID', '$Serving', '$SRP', '$Method', '$SourceID')";

$sql2 = "INSERT INTO DishIng (DishID, IngID, Volume) VALUES ('$DishID', '$IngID', '$Volume')";

$it = new ArrayIterator ( $array );

$cit = new CachingIterator ( $it );

foreach ($cit as $value)
{
  $sql2 .= "('".$cit->key()."','" .$cit->current()."')";

    if( $cit->hasNext() )
    {
        $sql2 .= ",";
    }
}

if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}
echo "1 record added";


if (!mysqli_query($con,$sql2)) {
  die('Error: ' . mysqli_error($con));
}
echo "records added";


require_once('db_disconnect.php');
php?>

当前提交时,它只更新“Dishes”表,并给我以下消息:“1 record addedError:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以获得正确的语法,以便在第1行使用”接近“(”0“、”$DishID“)、(”1“、”$IngID“)、(”2“、”$Volume“)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-23 03:26:32

您需要更改表单,以便对重复输入使用数组样式名称:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form action="Array.php" method="post">
<ul>
<li>DishID: <input type="text" name="DishID"></li>
<li>Name: <input type="text" name="DishName"></li>
<li>Catagory : <input type="text" name="DishCatID"></li>
<li>Serving: <input type="text" name="Serving"></li>
<li>SRP: <input type="text" name="SRP"></li>
<li>Method : <input type="text" name="Method"></li>
<li>Source : <input type="text" name="SourceID"></li>
<br>
<li>IngID: <input type="text" name="IngID[]"></li>
<li>Volume: <input type="text" name="Volume[]"></li>

<li>IngID: <input type="text" name="IngID[]"></li>
<li>Volume: <input type="text" name="Volume[]"></li>

<li>IngID: <input type="text" name="IngID[]"></li>
<li>Volume: <input type="text" name="Volume[]"></li>

</ul>
<input type="submit">
</form>

那么PHP应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$DishID = mysqli_real_escape_string($con, $_POST['DishID']);
$DishName = mysqli_real_escape_string($con, $_POST['DishName']);
$DishCatID = mysqli_real_escape_string($con, $_POST['DishCatID']);
$Serving = mysqli_real_escape_string($con, $_POST['Serving']);
$SRP = mysqli_real_escape_string($con, $_POST['SRP']);
$Method = mysqli_real_escape_string($con, $_POST['Method']);
$SourceID = mysqli_real_escape_string($con, $_POST['SourceID']);

$sql="INSERT INTO Dishes (DishID, DishName, DishCatID, Serving, SRP, Method, SourceID)
      VALUES ('$DishID', '$DishName', '$DishCatID', '$Serving', '$SRP', '$Method', '$SourceID')";
mysqli_query($con, $sql) or die(mysqli_error($con));

$values = array();
foreach ($_POST['IngID'] as $i => $ingID) {
    if (!empty($ingID)) {
        $ingID = mysqli_real_escape_string($con, $ingID);
        $volume = mysqli_real_escape_string($con, $_POST['Volume'][$i]);
        $values[] = "('$DishID', '$ingID', '$volume')";
    }
}
if (!empty($values)) {
    $sql2 = 'INSERT INTO DishIng (DishID, IngID, Volume) VALUES ' . implode(', ', $values);
    mysqli_query($con, $sql2) or die(mysqli_error($con));
}
票数 0
EN

Stack Overflow用户

发布于 2014-09-22 23:47:20

对于$sql2,在foreach循环中添加的第一行不以逗号分隔。它也没有相同数量的字段(3和2)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$sql2 = "INSERT INTO DishIng (DishID, IngID, Volume) VALUES ('$DishID', '$IngID', '$Volume')"; // 3 fields
...
$sql2 .= "('".$cit->key()."','" .$cit->current()."')"; // 2 fields

这样做的一个好方法是将字符串存储在数组中,并使用implode函数和','作为粘合剂。两个元素之间将自动插入逗号。

票数 1
EN

Stack Overflow用户

发布于 2014-09-22 23:50:01

您应该查看创建的查询。

静态sql2-string和动态值之间缺少逗号。此外,我认为要插入的值不正确。使用您创建的查询,您希望插入4行,并且在请求中使用dishID、IngID和IngID作为IngID,我认为这是您不希望的。

P.S.:在实现语句之前,您可以使用诸如MySQL工作台之类的工具来测试它们。(你可以看到他们的结果)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25989551

复制
相关文章
Spring中的AOP——在Advice方法中获取目标方法的参数
访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法:
林老师带你学编程
2019/05/25
6.2K0
Kotlin在协程中使用Select表达式选择最快结果
Kotlin在1.6时增加了Select的表达式,可以同时等待多个挂起函数,并选择第一个可用的。其实就是说在并行的运算中,直接返回最快的结果。
Vaccae
2022/12/29
6480
Kotlin在协程中使用Select表达式选择最快结果
Java中判断平年闰年最快方法
使用isLeap ,如果为true,那么是闰年,否则为平年 . isLeap需要Year来使用 import java.time.Year; public class Test { public static void main(String[] args) { Year year = Year.of(2000); System.out.println(year.isLeap()); } }
CaesarChang张旭
2021/03/07
1K0
最快速获取全国及全球省市区信息的方法。
最近需要做一个省市区选择的功能,突然想起之前在哪里看见过qq这个工具免费给我提供了文件的。可是想不起来在哪里,在网上找了下相关文章,似乎没有合适的,然后凭着记忆力去qq的安装路径下找了下,终于找到了。
易兒善
2018/08/21
1.2K0
最快速获取全国及全球省市区信息的方法。
在机器学习中处理大量数据!
知乎 | https://zhuanlan.zhihu.com/p/357361005
Datawhale
2021/03/26
2.3K0
在机器学习中处理大量数据!
getBoundingClientRect方法获取元素在页面中的相对位置
获取元素位置可以用 offset 或 getBoundingClientRect,使用 offset 因为兼容性不好,比较麻烦,offset获取位置会形成“回溯”。而 getBoundingClientRect 方法则 兼容性较好,基本所有的浏览器都支持了,且使用起来更容易和简单。
用户6167509
2019/09/04
3.9K0
mysql 获取分组中最新记录SQL写法示例 select group by order by
and it is producing the correct results however they are not in the correct order.
一个会写诗的程序员
2020/05/18
2.6K0
BeautifulSoup解析库select方法实例——获取企业信息
本文内容由浙江浦江中学方春林老师提供。 Requests 是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以
Python小屋屋主
2018/04/16
8670
BeautifulSoup解析库select方法实例——获取企业信息
最快的 Hexo 博客搭建方法
使用 Cloud Studio ,就不需要再折腾 Hexo 环境,不需要再解决不同平台上的各种冲突,直接在 Cloud Studio 里面即可进行 Hexo 的写作和部署。
腾讯云 CODING
2019/09/16
1.2K0
最快的 Hexo 博客搭建方法
记录GOPATH在GOLAND中的坑
这里的GOPATH已经出错了,所以编译找不到,我检查了go env也是正确的GOPATH....
超蛋lhy
2018/08/31
1.8K0
记录GOPATH在GOLAND中的坑
[cloc]在Windows中配置cloc的记录
https://github.com/AlDanial/cloc/releases
逝水经年
2022/03/14
2.9K0
js:如何获取select选中的值
<select id=”select”> <option value=”A” url=”http://www.baidu.com”>第一个option</option> <option value=”B” url=”http://www.qq.com”>第二个option</option> </select> 一:JavaScript原生的方法
全栈程序员站长
2022/11/04
26.8K0
最快的 Hexo 博客搭建方法
使用 Cloud Studio ,就不需要再折腾 Hexo 环境,不需要再解决不同平台上的各种冲突,直接在 Cloud Studio 里面即可进行 Hexo 的写作和部署。
全栈程序员站长
2022/06/29
7880
最快的 Hexo 博客搭建方法
vue中同时获取select下拉框的值和文本
在下是首席架构师
2023/07/04
1.9K0
vue中同时获取select下拉框的值和文本
antd的select 的key 和value获取
*默认情况下 onChange 里只能拿到 value,如果需要拿到选中的节点文本 label,可以使用 labelInValue 属性。 选中项的 label 会被包装到 value 中传递给 onChange 等函数,此时 value 是一个对象
用户4344670
2020/02/13
10.3K0
antd的select 的key 和value获取
Hive中SELECT TOP N的方法(order by与sort by)
版权声明:本文为博主-姜兴琪原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxq0816/article/details/87784068
week
2019/03/14
3.9K0
OrientDB显示记录SELECT命令的基本语法
在检索记录时,我们有不同的查询变体或选项以及select语句,以下语句是SELECT命令的基本语法。
用户4988376
2021/08/13
1.2K0
laravel-admin select、multipleSelect从api中获取选项列表
select、multipleSelect从api中获取选项列表 $form->select($column[, $label])->options([1 => 'foo', 2 => 'bar', 'val' => 'Option name']); 或者从api中获取选项列表: $form->select($column[, $label])->options('/api/users'); 其中api接口的格式必须为下面格式: [ { "id": 9, "tex
友儿
2022/09/11
3.8K0
vue中获取外网IP的方法
之前有篇文章js获取客户端真实IP记录了如何获取外网IP 那个只是在普通html页面当中的获取方法,在vue项目中就不能这么使用了。
薛定喵君
2020/08/12
6.3K2
点击加载更多

相似问题

在SQL中向表中插入大量记录的最快方法

71

在mysql中获取记录数的最快方法

32

使用MySQL在JDBC中运行大量SELECT查询的最快方法是什么?

137

这是在MySQL中获取记录的最快方法吗

32

使用ActiveRecords和Rails获取大量记录的最快方法(find_each很慢)

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文