【问题标题】:Is it possible to insert sql query in php array value?是否可以在 php 数组值中插入 sql 查询?
【发布时间】:2019-09-28 22:30:42
【问题描述】:
for($count = 0; $count < count($_POST["item_sub_category"]); $count++)
{
    $data = array(
        ':item_sub_category_id' 
             => SELECT r_name FROM Repair where r_id = $_POST["item_sub_category"][$count]
    );

    $query = "INSERT INTO Repairlog (description,visitID) VALUES (:item_sub_category_id,'1')";

    $statement = $connect->prepare($query);
    $statement->execute($data);

}

【问题讨论】:

  • 您是否尝试使用 SELECT 查询的结果作为 INSERT 查询的输入?这有点不清楚。但如果是这样,您可以将其编写为单个 SQL 语句。你现在这样做的方式,不会执行 SELECT 查询。您已经对其进行了参数化,因此它将被视为字符串。即使不是,它仍然不是有效的 SQL。谷歌“插入...选择”语法以获得正确的解决方案

标签: mysql sql arrays subquery sql-insert


【解决方案1】:

就问题而言,您的代码将无法正常工作。您作为参数传递的 SQL 查询将被简单地解释为字符串。

您可以利用INSERT INTO ... SELECT ... 语法来避免循环。这个想法是生成一个包含数组中所有值的IN 子句,然后运行单个查询以一次插入所有记录。

考虑:

$in  = str_repeat('?,', count($_POST["item_sub_category"]) - 1) . '?';
$query = "INSERT INTO Repairlog (description,visitID) SELECT r_name, 1 FROM Repair WHERE r_id IN ($in)";
$statement = $connect->prepare($query);
$statement->execute($_POST["item_sub_category"]);

注意:visitID 很可能是整数而不是字符串;如果是这样,那么最好不要用单引号将值括起来(我在上面的代码中删除了它们)。

【讨论】:

  • 如果复制的数据很大,可能先将select放入临时表,然后插入临时表数据。一般的想法是释放行(表/索引)locks更快在修复表上假设这里是 InnoDB 和一个复制的数据集,它可以放在一个内存表中,否则你仍然需要处理磁盘 I/O,因为它会变成一个基于磁盘的临时表
  • @RaymondNijland: 对...但另一方面,这种技术会产生某种竞争条件,其中在复制到临时表之后在Repair 中修改的记录不会被考虑INSERT 查询...
  • “但另一方面,这种技术会产生某种竞争条件,其中 INSERT 查询不会考虑复制到临时表后在修复中修改的记录。 ." .... INSERT INTO Repairlog (description,visitID) SELECT r_name, 1 FROM Repair WHERE r_id IN ($in) 在运行 INSERT. 后也不会考虑应对变化。这也不是你所说的竞争条件..
【解决方案2】:

TLDR;没有。

您的问题可以重新表述为:我可以在php 中编写SQL 代码。答案是不。您可以在php 中的String 类型变量(或参数)中编写SQL 代码。

这是任何编程语言的一般规则,在同一个文件中不能有多种语言,因为语言 parser 将无法理解是哪种语法。

为了在另一种语言中嵌入不同的语言,您需要某种分隔符来定义新的语言或特殊的类型何时开始以及何时开始结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多