【问题标题】:This foreach statement is only adding last row to the array此 foreach 语句仅将最后一行添加到数组
【发布时间】:2013-04-17 02:20:55
【问题描述】:

如何更改此 foreach 语句,以便它构建一个包含特定列中所有行的数组?它目前只将“first_name”列中的最后一行添加到数组中。

try {  
    $stmt = $conn->prepare("SELECT * FROM student");  
    $stmt->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
} 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$first_names = array();
foreach ($rows as $row) { 
  $first_names = $row['first_name'];
}

【问题讨论】:

  • 更新了我的答案以获得更多说明
  • @RixhersAjazi - 我想接受你的提议并由你快速提问 :-) 找不到你的电子邮件地址,所以想知道你是否有几分钟的时间聊天
  • 目前在课堂上哈哈
  • 哦,电子邮件在我的个人资料中:D

标签: php arrays foreach


【解决方案1】:

你可以试试这个

array_push($first_names, $row['first_name']);

$first_names[] = $row['first_name'];

您的代码中的问题是您一次又一次地覆盖自己的变量。

【讨论】:

  • 做到了 :-D 出于好奇,您介意解释第一种方法吗?我想知道是否可以通过允许我定义数组并在同一语句中使用它来减少一步?
  • 手册中有php.net/manual/en/function.array-push.php。您仍然需要一个数组,因为您必须从每一行中提取列的值。
  • 谢谢 :-) 我还在学习数组 :-) 一种方法比另一种方法有什么好处,还是只是个人喜好?
  • 第二种方法更适合单个元素,因为我们避免了方法调用的开销。但我觉得差别不大。我更喜欢第一种方式,因为我认为它更容易阅读,但这只是个人喜好。
  • 不客气。请将您认为最合适的答案标记为正确!
【解决方案2】:

你忘记了括号。你需要这样做:

$first_names[] = $row['first_name'];

否则,您将 $first_names 变量重新创建为单个字符串,并在循环的每次迭代中覆盖它。

【讨论】:

  • 我真的希望 SO 让我可以选择接受多个答案。你肯定给了我最清楚的解释是什么导致了问题,当我必须在最佳答案和我从中学到最多的答案之间做出选择时,我总是很纠结
【解决方案3】:

您当前正在覆盖需要将其填充到数组中的变量:

$first_names[] = $row['first_name'];

【讨论】:

    【解决方案4】:

    您必须在变量中添加括号`

    $first_names[] = $row['first_name'];`
    

    我还可以建议一种更清洁的方法吗?

    您似乎在查询中使用了 try/catch,并且可能在大多数查询中也使用了它...

    实际上你应该使用

    $pdo = new PDO("mysql:host=xxxxx;dbname=xxxxxxxx", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // < - - - THIS
    

    所以现在您不需要在代码中添加 try/catch。

    通常你只需要在查询失败时不想做其他事情时使用 try/catch。

    阅读此herehere

    享受:)

    【讨论】:

    • 感谢您的建议 :-) 我很好奇您对 try/catch 的评论 - 我实际上是在配置文件中构建这样的连接(这就是我使用 $conn 的原因->),但有人告诉我,我还应该用 try/catch 包围每个 db 查询。这是不必要的吗?
    • 好吧,就像我在此处的帖子和我链接的帖子中所说的那样,您想将它们包围在 try/catch 中的唯一原因是,如果查询出错,您不想做其他事情在你身上。例如,如果您想将它们记录在一个特殊的日志文件中,或者您有什么。查询要么失败,要么不失败......所以异常模式将处理该部分。
    • 只是把它放在上下文中,如果说你想做一个 try/catch 并且如果它失败了你想要一封电子邮件发送给你,那么是的 try/catch 将非常适合这个。 .. 但如果您只是想检查查询是否成功,那么让默认错误处理为您解决问题。
    • 我不确定我是否 100% 关注你,但我相信你正在确认我最初的想法(在 SO 被多次大喊之前 ;-) ) - 因为配置文件中有一个 try/catch 语句,每次我调用该函数时都会自动调用它。我说的对吗?
    • 当我回答自己的问题并得到 -1 时,让我大吃一惊:-D 这怎么可能?
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2018-09-06
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多