【问题标题】:Populating HTML from MySQL & PDO (PHP); foreach loop failing to write MySQL data从 MySQL 和 PDO (PHP) 填充 HTML; foreach 循环无法写入 MySQL 数据
【发布时间】:2012-10-11 05:10:57
【问题描述】:

正如标题所述,我的目标是使用 MySQL 数据库中的数据生成 HTML 表。

我使用的一般方法是合理的,因为我手动编写了一系列单元格,但我正在尝试对其进行扩展以包含大量字段,因此我正在尝试使用 PHP 为单元格编写 HTML和带有数组的 foreach 循环。我已经写出了我工作的背景和步骤,既可以为我的问题提供背景,也可以为处于类似情况的人们提供一般帮助。但是,我知道我遇到的问题特别在于一段代码 - 如果您想直接跳到它,请在下面清楚地指出。

第 1 步为我希望字段具有的标题和 MySQL 数据库中的列名定义数组:

$titles  = array('Name', 'Age', 'Height', 'Weight');
$headers = array('q1', 'q2', 'q3', 'q4');

第 2 步:连接数据库(之前定义的 $username 和 $password):

try {
    $pdo = new PDO('mysql:host=localhost; dbname=db01', $username, $password);
    $pdo->exec("SET CHARACTER SET utf8");

第 3 步:通过一些连接创建我的 SQL 语句,并获取 $result:

$sql ="SELECT";

foreach(array_combine($headers, $titles) as $header => $title) {
    $sql .= "`$header` AS `$title`,";
}

$sql .= "`q5` AS `Eye Color`";
$sql .= "FROM samdata.CO_data";


$result = $pdo->query($sql);

第 4 步:通过连接静态 HTML 和上述 SQL 查询的结果来创建 $html_table

if($result !== false) {
    $html_table = '<table><tr>';
    foreach($titles as $title) {
        $html_table .= "<th> $title </th>";                          
    }

    $html_table .='</tr> <tr>';


//*********PROBLEM SECTION BELOW **************************
    foreach(array_combine($result, $titles) as $row => $title) {                            
        $html_table .= "<td>' .$row\['$title'\]. '</td>";
    }
}
//*********PROBLEM SECTION ABOVE **************************

$html_table .= '</tr> </table>';
$conn = null;   

echo $html_table;       
}

我知道问题出在指示的部分,因为我已经测试了所有其他部分,如果我手动写出而不是组合数组/foreach 循环,例如:

foreach($result as $row) {
             $html_table .= '
             <tr>
                <td>' .$row['Names']. '</td>
                <td>' .$row['Age']. '</td>
                <td>' .$row['Height']. '</td>
            </tr>';
}

代替循环,它可以正常工作并显示这些标题的每个结果的数据,问题是我有数百个并且想要更优雅(和懒惰)而不是一个一个地写出来!

我哪里错了?非常感谢您的帮助。

【问题讨论】:

  • 你能试试把这行"&lt;td&gt;' .$row\['$title'\]. '&lt;/td&gt;"改成"&lt;td&gt; .$row['$title']. &lt;/td&gt;"
  • 好主意 - 但遗憾的是没有改变。
  • 我只是认为单引号会阻止代码运行。

标签: php html mysql loops pdo


【解决方案1】:

看起来您的问题行中有一些不匹配的引号:

$html_table .= "<td>' .$row\['$title'\]. '</td>";

您以双引号开头。在双引号内,单引号不能用于终止字符串。相反,双引号只能用双引号终止。单引号也是如此。意思是,这可以通过以下两种方式之一解决:

$html_table .= "<td>" . $row[$title] . "</td>";

或者:

$html_table .= '<td>' . $row[$title] . '</td>';

还要注意我是如何从$title 周围删除引号的。它们是不必要的,并且会使 PHP 做一些不必要的处理。

注意现在引号是如何匹配的。确保在编辑器中编写代码时,查看语法是如何突出显示的。您应该看到,在您的原始代码中,变量和索引都在字符串中,因为它们都是相同的颜色。

如果您依赖于双引号字符串中的变量扩展(如echo "Hello $name";),请知道访问数组的字符串键将不起作用,除非它们被括号括起来,如下所示:

echo "Hello {$person['FirstName']}";

但是,您可以像这样使用数字索引:

echo "Hello $people[0]";

因此,对于您的代码,如果您不想结束字符串并连接值然后再次开始字符串,则需要执行此操作:

$html_table .= "<td>{$row[$title]}</td>";

但是,我发现这种语法很难看,它使 PHP 进行额外处理以查找需要扩展变量的位置。恕我直言,使用串联来避免所有这些问题。

【讨论】:

  • 你不希望变量名用单引号括起来,应该是$html_table .= "&lt;td&gt;" . $row[$title] . "&lt;/td&gt;";$html_table .= '&lt;td&gt;' . $row[$title] . '&lt;/td&gt;';甚至$html_table .= "&lt;td&gt;{$row[$title]}&lt;/td&gt;";
  • 非常感谢:详细且有教育意义!看起来我有一个问题,它是这个语法错误的组合,并且按照此处的另一个答案正确循环 - 我会同时调整两者。再次感谢!
【解决方案2】:

您的循环不正确。 $result 是您必须获取的 PDOStatement。试试

foreach( $result->fetchAll() as $row ) {
    $html_table .= '<tr>' . "\n";
    foreach( $row as $col ) {
        $html_table .= '<td>' .$col. '</td>';
    }
    $html_table .= '</tr>' . "\n";
}

【讨论】:

  • 谢谢 - 我明白了,所以 $result 不是一个数组,因此我的循环失败。谢谢你 - 你的代码只显示一条记录而不是所有记录 - 我还没有完全理解你在这里做什么,所以不知道如何调试:有什么想法吗?
  • 另外 - 发生了一些奇怪的事情:我得到的一条记录是从几条记录中选择的不同字段(我可以看到我直接在 MySQL 工作台中查看表)
  • 您需要循环行,然后是列。刚刚编辑。再试一次。
  • 我的心都碎了 :) 非常感谢,我已经为此工作了好几个小时——效果很好!据我了解,如果您有时间解释,$result->fetchAll() as $data 是否会获取每个结果并将其转换为名为 $data 的数组?还有什么是\n?
  • PDOStatement::fetchAll() 返回一个包含结果集中所有剩余行的数组。取自php.net/manual/en/pdostatement.fetchall.php。干杯。
【解决方案3】:

这个解决方案似乎在我的项目中工作,并允许我从查询中获取列并将记录放入 html 表中,希望它也可以帮助其他人:

$conn = (...)

$sqlselect = "SELECT name, last, othercol FROM persontable";

// I prepare and execute my query
$stmt = $conn->prepare($sqlselect);
$stmt->execute();

//get full recordset: header and records
$fullrs = $stmt->fetchAll(PDO::FETCH_ASSOC); 

//get the first row (column headers) but do not go to next record
$colheaders = current($fullrs)

out = ""; //variable that will hold my table

out .= <table>;

//get my columns headers in the table          
foreach($colheaders as $key=>$val) 
{
    $out .= '<th>'.$key.'</th>';
}

//get my records in the table
foreach($fullrs as $row) 
{
   $out .= "<tr>"; 
      $out .= '<td>'.$row['name'].'</td>';
      $out .= '<td>'.$row['last'].'</td>';
      $out .= '<td>'.$row['othercol'].'</td>';
   $out .= "</tr>";
}

out .= </table>;  

//spit my table out
echo $out;

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2014-05-26
    • 2014-01-19
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多