【问题标题】:Results of MYSQL query printed twice using PDO使用 PDO 打印两次 MYSQL 查询的结果
【发布时间】:2013-07-16 10:09:41
【问题描述】:

我是一名教师,我有一个名为“gabber”的 mysql 表,其中包含学生测验的分数。这些字段是“锻炼”、“实名”、“分数”、“开始时间”和“结束时间”。如果学生完成了不止一种类型的测验,那么这将在表格中显示为另一行,但当然具有不同的练习值。

下面的代码几乎可以正常工作,它首先找到唯一的锻炼值,并使用这些值来打印表格列标题。这些独特的练习值也用于创建第二个查询,该查询找到每个学生在每次测验中尝试的最低(即第一次尝试)分数。

无论如何,php 代码除了打印每个值两次之外都可以工作。即名称被打印两次,每个分数也是如此。我知道我的查询绝对正确(在 phpmyadmin 中测试),但我认为嵌套的 for 循环中出现了问题。我曾尝试阅读查询返回的 PDOstatement,但我无法理解。我很欣赏 stackoverflower 上还有其他关于“打印两次”的帖子,但他们无法帮助我解决这个问题。

任何关于如何完成这项工作的建议都会非常好。谢谢,马特。

<?
$dbh = new PDO("mysql:host=XXX;dbname=gabber", user, pass);
$query2 = "SELECT realname";

echo '<style>table{border-collapse:collapse;}';
echo 'table, td, th{border:1px solid black;}</style>';
echo '<table><tr><td></td>';

foreach($dbh->query('SELECT DISTINCT Exercise FROM a2_physics') as $row) {
    echo '<td>';
    echo $row[0];
    echo '</td>';
    $query2.=', MIN( IF( Exercise = "';
    $query2.=$row[0];
    $query2.='", Score, NULL ) ) AS "';
    $query2.=$row[0];
    $query2.='"';
    }
echo '</tr>';

$query2=$query2.' FROM a2_physics';
$query2=$query2.' GROUP BY realname';

//echo $query2;
foreach($dbh->query($query2) as $row) {
echo '<tr>';
foreach($row as $element)
{
echo '<td>';
echo $element;
echo '</td>';
}
echo '</tr>';
}
echo '</table>';
?>

【问题讨论】:

  • 这是 pdo 还是新的获取方法?
  • 您听说过 .= 运算符吗?
  • 我相信我正在使用 PDO,并且我没有使用 fetch 方法。但恐怕我对sql很陌生
  • 感谢 Steven,我会实现它来清理一下。

标签: php mysql pdo


【解决方案1】:

连接PDO时,这样做

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $user, $pass, $opt);

【讨论】:

  • 谢谢。您指定的这些选项会阻止我的数据打印两次吗?
  • 很遗憾没有。这完全折叠了表格,只给了我第一列(名称)。
  • 不,但这是更好的编码实践的开始。现在您可以开始使用字段名而不是字段索引。例如$row['Excercise'] 而不是$row[0]。这应该可以帮助您更好地了解自己在做什么。
  • 是的,这些选项之一正是为此目的
  • 先生。常识并没有真正回答那里的问题。我一直有同样的双重打印问题,显然这是因为属性默认存储两次。方法如下:如果您的表有列 a1 和 a2,则每个 $row 将包含每个列两次,一个按数字索引,另一个按关联索引。所以你的 $row 实际上包含 $row[0], $row["a1"], $row[1], $row["a2"]。常识先生写的破坏你代码的选项是“PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC”,这样你就不能再调用$row[0],只能调用$row["a1"]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2020-09-17
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多