【问题标题】:Get data from mysql database inside for loop with php pdo使用php pdo从for循环中的mysql数据库获取数据
【发布时间】:2014-11-04 17:47:43
【问题描述】:

我有这个 php 代码 - for 循环,在每一步,每次增量搜索 mysql 表中的数据 aktivnosti

PHP:

for ($i=1; $i<=30; $i++;){
    $temp = array();
    $temp['ID'] = $i;

// ATTEMP TO GET DATA FROM aktivnosti WHERE id_activity = $i

    $rs1 = $db->prepare('SELECT naziv FROM aktivnosti WHERE id_activity=:idd');
          $rs1->bindParam(':idd', $i); 

          $rs1->execute();
          $naz = $rs1->fetchColumn();

          $temp['activity'] =  '<button>'.$naz.'</button>';



    $output['data'][] = $temp;

}
$jsonTable = json_encode($output);

正如您从上面的代码中看到的那样,我尝试获取每个$i 增量的数据并搜索id_activity on table aktivnosti = $i

我只得到一个结果,所以我只得到第一个 'naziv',我需要从 id_activity = $i 的表 aktivnosti 中获取所有 naziv 数据并创建:

<button>$naz[0]<button>
<button>$naz[1]<button>
<button>$naz[2]<button>
<button>$naz[how many times id_activity = $i]<button>

我该怎么做?一些想法?

对不起我的英语。谢谢

【问题讨论】:

  • 为什么不直接获取您需要的所有行,然后遍历结果呢?而不是访问数据库 30 次?
  • 查询准备应该退出(之前)for循环。
  • 因为我需要创建一个具有 30 行 30 IDS 的 JSON...
  • 您发出 30 个数据库请求而不是 1 个?如果有人删除活动怎么办?然后您的代码将停止工作。
  • for 循环是 30 次,因为在数据库中我存储了一个月的天数,所以我不知道我在哪一天有活动,所以我创建循环来处理 mysql 表 aktivnosti 并捕获数据...

标签: php mysql json pdo


【解决方案1】:

正如上面 cmets 中所指出的,您在这里采取了错误的方法。您应该能够在单个查询中获取所有这些数据。如果您想拥有固定 30 天的概念,并且每一天与 n 记录数相关,您可能还需要查看您的架构。我建议两张桌子

day_list

day_id  day_name (or any other day-related data fields)
1       ...
2       ...
...     ...
30      ...

days_records

record_id   day_id   other_data
1           1        ...
2           1        ...
3           3        ...
4           5        ...
...

然后你会这样查询:

SELECT
    d.day_id AS day_id
    dr.record_id AS record_id
    dr.other_date AS other_data
FROM day_list AS d
LEFT JOIN day_records AS dr
    ON d.day_id = dr.day_id

很抱歉更改了表名,因为不知道您的数据库架构在现实世界中代表什么。

然后您进行如下查询:

$query = <<<EOT
SELECT
    d.day_id AS day_id
    dr.record_id AS record_id
    dr.other_date AS other_data
FROM day_list AS d
LEFT JOIN day_records AS dr
    ON d.day_id = dr.day_id
EOT;

$rs1 = $db->execute($query);
if (false === $rs1) {
   // something went wrong. perhaps log an error
} else {
   while($row = $rs1->fetch(PDO::FETCH_ASSOC)) {
        $temp = $row;
        // check to see if this date has a record
        if (empty($temp['record_id'])) {
            // this is a day with no associated record.
            // do something
        }
        // not shown - continue to manipulate your $temp as desired
        // then add to output array
        $output['data'][] = $temp
   }
}

【讨论】:

  • 迈克,我需要创建一些垂直日历...所以第一列是日期(1-30 个月的天数),第二列是活动,所以每天我需要搜索是否有一些活动,如果没有,我创建 ...它不是我的问题的答案
  • @JamesD。实际上是。事实上,您会将静态天数列表加入记录本身。您将获得日期表中没有当天记录的项目的 NULL 值。我将在我的代码中添加示例。
  • 好的,我会检查 data == NULL 然后我创建 html 以在那天显示
  • 但是 while 与 for 循环相同...我需要创建这个:imgur.com/mXr3ax7 所以它的数据表包含日期列和活动列
  • 检查答案,我更新它,虽然我在上面的答案中使用它......
【解决方案2】:

如果您同时需要IDactivity

$sql = <<<EOD
SELECT
    id_activity AS ID,
    CONCAT('<button>', naziv, '</button>') AS activity
FROM aktivnosti
WHERE id_activity BETWEEN 1 AND 30
ORDER BY id_activity
EOD;
$data = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$jsonTable = json_encode(compact('data'));

如果你只使用activity:

$sql = <<<EOD
SELECT CONCAT('<button>', naziv, '</button>')
FROM aktivnosti
WHERE id_activity BETWEEN 1 AND 30
ORDER BY id_activity
EOD;
$data = $db->query($sql)->fetchAll(PDO::FETCH_COLUMN, 0);
$jsonTable = json_encode(compact('data'));

【讨论】:

  • 你能重写我的代码吗,因为我在我的应用程序中没有用处
  • ...你真的需要ID吗?
  • 所以,使用第二个 sn-p。您可以获得以下 json:{"data":["&lt;button&gt;$naz[0]&lt;/button&gt;","&lt;button&gt;$naz[1]&lt;/button&gt;",...,"&lt;button&gt;$naz[29]&lt;/button&gt;"]}
【解决方案3】:

试试这个...

 while($naz=$rs1->fetch(PDO::FETCH_OBJ))

{

echo $naz->column1;
echo $naz->column2;

}

而不是

 $naz = $rs1->fetchColumn();

【讨论】:

  • 我收到此错误:可捕获的致命错误:第 45 行 /home/agroagro/public_html/template/tema/table1.php 中的类 stdClass 对象无法转换为字符串
  • $rs1 = $db->prepare('SELECT naziv FROM aktivnosti WHERE id_activity=:idd'); $rs1->bindParam(':idd', $i); $rs1->执行(); while($naz=$rs1->fetch(PDO::FETCH_OBJ)) { $temp['vrsta'] = ''; } $output['data'][] = $temp; $i++; } $jsonTable = json_encode($output);
  • 试试这个 $rs1 = $db->prepare('SELECT naziv FROM aktivnosti WHERE id_activity=:idd'); $rs1->bindParam(':idd', $i); $rs1->执行(); while($naz=$rs1->fetch(PDO::FETCH_OBJ)) { $temp['vrsta'] = ''; } $output['data'][] = $temp; $i++; $jsonTable = json_encode($output);
  • 我得到:解析错误:语法错误,第 43 行 /home/agroagro/public_html/template/tema/table1.php 中的意外“捕获”(T_CATCH)
  • $rs1 = $db->prepare('SELECT naziv FROM aktivnosti WHERE id_activity=:idd'); $rs1->bindParam(':idd', $i); $rs1->执行(); while($naz=$rs1->fetch(PDO::FETCH_OBJ)) { $temp['vrsta'] = ''; } $output['data'][] = $temp; $i++; $jsonTable = json_encode($output);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
相关资源
最近更新 更多