0

我有包含人员的数据库,每个人都可以有多个联系人(例如 ICQ、电子邮件等)。我需要在我的页面上打印这个。

我正在使用包含表的 PostgreSQL 数据库,kontakty并且该表的行具有列id_osoby(外键 REFERENCES osoby)、id_typy_kontaktu(外键 REFERENCES typy_kontakty)和kontakt.

$stmt = $db->query("SELECT * FROM kontakty WHERE id_osoby = $row[id_osoby]");
            $row_kontakty = $stmt->fetch();

            $stmt = $db->query("SELECT * FROM typy_kontaktu WHERE id_typy_kontaktu = $row_kontakty[id_typy_kontaktu]");
            $row_id_typy_kontaktu = $stmt->fetch();

          echo "<tr align='left'>";
          echo "<td><span style='color:white'><strong>Kontakt: </strong></span></td>";
          echo "<td><em><strong>&nbsp&nbsp$row_id_typy_kontaktu[nazev]:</strong></em> $row_kontakty[kontakt]</td>";
          echo "</tr>";

但是我的代码只打印一个联系人,但是人们有几个联系人,我需要打印所有联系人。

希望你明白我想说什么。谢谢你的答案:)

4

2 回答 2

3

您需要学习一些有关如何从 PHP 使用数据库的基础知识,因为您的代码非常糟糕。查找使用 PHP 数据库的 SQL 基础教程。

您的代码应该:

  • 在 SQL 查询中使用连接并且只查询一次;

  • 在 PHP 代码中使用循环来遍历查询结果中的行,例如

    而 ( $row = $stmt->fetch() )
    {
      回声...;
    }
  • 转义数据htmlspecialchars()以避免跨站点脚本漏洞;

  • 使用带有绑定参数的准备好的语句来避免 SQL 注入漏洞(如果您的代码易受攻击与否取决于谁可以控制$row[id_osoby]变量,但您应该始终使用绑定参数以防万一)。

于 2013-01-05T21:33:35.687 回答
0

与 Tometzky +1,我会补充说,你最好用简单的英语命名你的表格,使用单数形式来避免不规则复数(这是我的观点,但在互联网上寻求帮助时它更简单,而且我不是英语为母语的人任何一个)。

使用像Pomm这样的现有对象模型管理器会让您的生活更轻松。如果您知道您在生产中使用 Postgresql,您可能希望受益于其面向对象的特性并在一个查询中获取整个连接。

使用 Pomm,您可以编写:

$sql = <<<SQL
SELECT 
  c.*,
  array_agg(ct) AS contact_types
FROM 
  kontakty c
    LEFT JOIN typy_kontaktu ct USING (id_typy_kontaktu)
WHERE 
    id_osoby = ?
GROUP BY
  c.id_typy_kontaktu
SQL;

$results = $connection
    ->getMapFor('Database\Schema\Kontakty')
    ->find($sql, array($row[id_osoby]));
?>
<ul>
<?php foreach($results as $kontakt): ?>
  <li>
    <p><?php echo $kontact['name'] ?>:
      <ul>
<?php foreach($kontakt['contact_types'] as $contact_type): ?>
        <li><?php echo $contact_type['type'] ?> : <?php echo $contact_type['value'] ?></li>
<?php endforeach ?>
      </ul>
    </p>
  </li>
<?php endforeach ?>
</ul>
于 2013-01-06T12:20:07.103 回答