【问题标题】:Why am I receiving only the first value for each element of the array?为什么我只收到数组每个元素的第一个值?
【发布时间】:2013-02-01 14:52:33
【问题描述】:

我无法弄清楚为什么我的所有结果都是它返回的第一个值的重复。

此代码返回相同的 ID 和重复的格式化日期;但是,我希望它读取一个值,然后为数据库中的每个条目转换该值。这是我的代码:

<?php
include('../includes/conn.inc.php');
$stmt = $mysql->prepare("SELECT id, endDate FROM TABLE ORDER BY id");
$stmt->execute();
$stmt->bind_result($id, $endDate);

while($row = $stmt->fetch()) {
    $dataRow[] = array('id'=>$id,'endDate'=> $endDate);
};

foreach($dataRow as $i) {
    $newEndDate = date('Y-m-d',strtotime($endDate));
    $sql = 'UPDATE TABLE SET startDate = ? WHERE id= ? ';
    $stmt = $mysql->stmt_init();
    if ($stmt->prepare($sql)) { 
        $stmt->bind_param('si',$newEndDate, $id);
        $OK = $stmt->execute();}
        if ($OK) {
            echo $id . " " . $newEndDate .  "done <br/>";
        } else {
            echo $stmt->error;
        } 
        $stmt->close();
    };  

【问题讨论】:

  • 您是否将 EndDate 从错误的格式转换?
  • 要调试它,暂时忽略foreach(可以优化,但这与您的问题无关)并查看$dataRow 是否正确构造:var_dump($dataRow) 之后的输出是什么环形?它在循环内输出什么?
  • foreach($dataRow as $i){ print_r($i);回声“
    ”;这正确输出了数组

标签: php arrays foreach mysqli


【解决方案1】:

在您的 foreach 中,您始终使用从 last $stmt-&gt;fetch()

设置的最后一个值

试试:

foreach($dataRow as $i) {
    $newEndDate = date('Y-m-d',strtotime($i['endDate']));
    $id = $i['id'];
    $sql = 'UPDATE TABLE SET startDate = ? WHERE id= ? ';
    $stmt = $mysql->stmt_init();
    if ($stmt->prepare($sql)) { 
        $stmt->bind_param('si',$newEndDate, $id);
        $OK = $stmt->execute();
    }
    if ($OK) {
        echo $id . " " . $newEndDate .  "done <br/>";
    } else {
        echo $stmt->error;
    } 
    $stmt->close();
}; 

【讨论】:

  • 这不应该是bind_result 的问题。每次调用fetch() 都会更新引用
  • 当我像这样从 foreach 内部输出数组时,它可以正常工作。只有当我运行第二个查询时,它才会返回一堆具有相同 id 和 enddate foreach($dataRow as $i){ print_r($i); 的结果回声“
    ”;
  • 将您获得的结果添加到原始帖子中。
【解决方案2】:

使用get_result();

$dataRow = array()
$stmt = $mysql->prepare("SELECT id, endDate FROM TABLE ORDER BY id");
$stmt->execute();
$result = $stmt->get_result();
while($row = $result->fetch_array()) {
    $dataRow[$row['id']] = $row['endDate'];
}

并且您没有在第二个循环中填充 $endDate

foreach($dataRow as $i => $endDate){
    $newEndDate = date('Y-m-d',strtotime($endDate));
    ... // rest of your code

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2018-11-09
    • 2018-07-12
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多