【问题标题】:foreach loop multiple array value update using pdoforeach 循环使用 pdo 更新多个数组值
【发布时间】:2014-01-06 03:59:26
【问题描述】:
<?php
$roll  = $_POST['roll'];
$score = $_POST['a'];
$test  = $_SESSION['test'];
$class = $_SESSION['class'];
print_r($roll);
print_r($score);
global $pdo;
require('connect.php');
$stmt=$pdo->prepare("update atten set $test=? where roll=?");
foreach( $roll as $rollno)
{
    $stmt->bindparam(2,$rollno);
    foreach( $score as $key)
    {
        $stmt->bindparam(1,$score);
        $stmt->execute();
    }
}
if($stmt==false)
{
    die("error".print_r($stmt->errorinfo()));
}
?>

这里$roll 是一个数组值,$score 也是一个数组值。这里 以所有卷号为例的最后一次值更新 $roll=1,2,3,4$score(10,20,30) 我不知道,但这里所有卷号的 30 值更新。 请帮帮我..谢谢..

【问题讨论】:

  • 您将global $pdo; 置于数据库连接范围之外。但是,不建议使用该方法。你的session_start(); 在哪里?另外,这是错误的$stmt-&gt;bindparam(2,$rollno);
  • 你能解释一下代码示例吗

标签: php arrays pdo


【解决方案1】:

目前,您正在将每一个分数保存在所有卷中,因此最后一个分数将始终设置为您的卷。

错误在于您使用了两个 foreach 循环,但您只需要一个,您只需要将滚动和分数相互匹配即可。

如果您绝对确定数组的长度相同并且索引方式相同(具有相同的键 - 您可以使用 array_values PHP 函数来确保),您可以使用 for 循环来代替

for($i = 0; $i < count($roll); $i++){
    $stmt->bindparam(1, $roll[$i]);
    $stmt->bindparam(2, $score[$i]);
    $stmt->execute();
}

PHP 函数 array_combine 在这里也可能很有用,因为您可以执行以下操作:

array_combine($roll, $score);

然后像往常一样使用 foreach 循环。

编辑:根据要求,array_combine 示例:

<?php
$roll  = $_POST['roll'];
$score = $_POST['a'];
$test  = $_SESSION['test'];
$class = $_SESSION['class'];
print_r($roll);
print_r($score);
global $pdo;
require('connect.php');
$stmt=$pdo->prepare("update atten set $test=? where roll=?");

if(count($roll) !== count($score))
    die('Arrays are not the same length!');

$rollsToScores = array_combine($roll, $score);

foreach($rollsToScores as $roll => $score){
    $result = $stmt->execute(array($score, $roll));
    if($result === false){
        die("error".print_r($stmt->errorinfo()));
        break;
    }
}

?>

【讨论】:

  • 如果我在这里用户for循环没有值更新到数据库中
  • 我有点困惑这里发生了什么。您应该尝试在其中进行一些调试并 var_dump 您正在绑定的内容,这将帮助您弄清楚发生了什么。
  • 你能在这里解释一下array_combine()example
【解决方案2】:

您在内部循环绑定参数$stmt-&gt;bindparam(1,$score); 中传递$array

我觉得

$stmt->bindparam(1,$score);

应该是:-

$stmt->bindparam(1,$key);

修改后的代码块:-

foreach( $roll as $rollno)
{
    $stmt->bindparam(2,$rollno);
    foreach( $score as $key)
    {
    $stmt->bindparam(1,$key);
    $stmt->execute();
    }
}

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2016-02-26
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多