【问题标题】:How to pass multiple variables in foreach php如何在foreach php中传递多个变量
【发布时间】:2018-09-02 10:11:48
【问题描述】:

我想在 foreach 循环中传递多个变量,以将 $array_sma[] 中的值添加到我的数据库中。但到目前为止,我只能从 $short_smas 中插入值,而我还想从 $mid_smas 中插入值。我尝试过嵌套 foreach,但它使值相乘。

$period = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);

$sma = array(6,9);

foreach ($sma as $range)    {


$sum = array_sum(array_slice($period, 0, $range));

$result = array($range - 1 => $sum / $range);


for ($i = $range, $n = count($period); $i != $n; ++$i) {

        $result[$i] = $result[$i - 1] + ($period[$i] - $period[$i - $range]) / $range;

}

$array_sma[] = $result;

}

list($short_smas,$mid_smas)=$array_sma;

foreach ($short_smas as $short_sma) {

$sql = "INSERT INTO sma (short_sma) 

  VALUES ('$short_sma') ";

if ($con->query($sql) === TRUE) {

    echo "New record created successfully<br><br>";

} else {

    echo "Error: " . $sql . "<br>" . $con->error;

}

}

我的问题中的代码运行良好,即 $array_sma[] 的第一个子数组 ($short_smas) 的值被插入到我的 msql 数据库的 short_sma 列中。我遇到的问题是,当我尝试在我的数据库调用 mid_sma 的第二列中插入来自 $array_sma[] 的第二个子数组 $mid_smas(参见 list())时。

我认为这已接近我想要实现的目标,但数据库中仍然没有插入任何内容,来源:php+mysql: insert a php array into mysql

我没有任何 mysql 语法错误。

$array_sma[] = $result;

 $sql = "INSERT INTO sma (short_sma, mid_sma) VALUES ";
foreach ($array_sma as $item) {
 $sql .= "('".$item[0]."','".$item[1]."'),";
}

$sql = rtrim($sql,",");

【问题讨论】:

  • 您正在寻找的结果是什么,可能有更简单的方法可以做到这一点,但我需要看看最终结果应该是什么样子(如果它有效的话)。
  • @Seb 你的最后一条评论属于问题:我已经复制粘贴到正文中

标签: php arrays foreach


【解决方案1】:

主要问题$short_smas$mid_smas 的大小不同。此外,它们是关联数组,因此您可以从两者中选择唯一的键,并允许只有一个值可用的键为空值,或者您只选择两个数组中都存在的键。下面的代码提供了第一个解决方案。

// first lets pick unique keys from both arrays
$uniqe_keys = array_unique(array_merge(array_keys($short_smas), array_keys($mid_smas)));
// alternatively we can only pick those present in both
// $intersect_keys = array_intersect(array_keys($short_smas),array_keys($mid_smas));

// now lets build sql in loop as Marcelo Agimóvel sugested
// firs we need base command:
$sql = "INSERT INTO sma (short_sma, mid_sma) VALUES ";

// now we add value pairs to coma separated list of values to
// insert using keys from prepared keys array
foreach ($uniqe_keys as $key) {
    $mid_sma = array_key_exists($key, $mid_smas)?$mid_smas[$key]:"";
    $short_sma = array_key_exists($key, $short_smas)?$short_smas[$key]:"";
    // here we build coma separated list of value pairs to insert
    $sql .= "('$short_sma', '$mid_sma'),";
}
$sql = rtrim($sql, ",");

// with data provided in question $sql should have string:
// INSERT INTO sma (short_sma, mid_sma) VALUES, ('3.5', ''), ('4.5', ''), ('5.5', ''), ('6.5', '5'), ('7.5', '6'), ('8.5', '7'), ('9.5', '8'), ('10.5', '9'), ('11.5', '10'), ('12.5', '11')

// now we execute just one sql command
if ($con->query($sql) === TRUE) {
    echo "New records created successfully<br><br>";
} else {
    echo "Error: " . $sql . "<br>" . $con->error;
}

// don't forget to close connection

Marcelo Agimóvel 还建议不要像这样插入多个:

INSERT INTO tbl_name (a,b,c) VALUES (1,2,3);

最好使用单一的:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

这就是为什么我在foreach 循环中将值对附加到$sql 并在循环外执行查询。


另外值得一提的是,与其直接执行 sql,不如使用准备好的语句,因为它们不太容易发生 sql 注入。

【讨论】:

  • Seb 这是你的答案,我建议你在 foreach 内部构建查询,但只在 foreach 外部执行。这将提高您的查询性能。永远不要在循环中使用查询。不错的代码,顺便说一句。
  • @Seb 我根据您在评论中包含的内容修改了我的答案。您是否需要有关 INSERT 修改的帮助,以便它处理两个字段而不是一个字段?
  • 谢谢。如果您打印 $array_sma[],您会看到它包含两个子数组,我已将它们放入两个变量中(参见 list())$short_smas 和 $mid_smas。这些是我想放入我的数据库的值。在我的代码中,我只在我的数据库中插入了 short_sma,因为我不知道如何插入多个变量,这就是我想要找出的,即如何在我的数据库中插入 mid_sma 记住这一点我的数据库中有一个特定的列。
  • @Seb 然后你需要构造:INSERT INTO tbl_name (a,b,c) VALUES (1,2,3);我再次编辑了我的答案,请查看代码,并注意按照 Marcelo Agimóvel 的建议构建单个 INSERT
  • @Seb 你没有 INSERT 因为 $item[0] 和 $item[1] 是空的,你的数组只有两行和很多列,所以你得到: INSERT ... VALUES ('' ,''),('','')
猜你喜欢
  • 2020-08-21
  • 2014-05-13
  • 2016-04-14
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
相关资源
最近更新 更多