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>";

しかし、私のコードは1人の連絡先しか印刷しませんが、人には複数の連絡先があり、すべてを印刷する必要があります。

私が言いたかったことを理解していただければ幸いです。答えのためのThx:)

4

2 に答える 2

3

あなたのコードは非常に悪いので、PHPからデータベースを使用する方法についていくつかの基本を学ぶ必要があります。PHPのデータベースを使用して、SQLの基本に関するチュートリアルを見つけてください。

コードは次のようにする必要があります。

  • SQLクエリで結合を使用し、クエリを1回だけ実行します。

  • PHPコードのループを使用して、クエリ結果の行を反復処理します。

    while($ row = $ stmt-> fetch())
    {{
      エコー ...;
    }
  • htmlspecialchars()クロスサイトスクリプティングの脆弱性を回避するためにデータをエスケープします。

  • SQLインジェクションの脆弱性を回避するために、バインドされたパラメーターを持つプリペアドステートメントを使用します(コードが脆弱であるかどうかは$row[id_osoby]、変数を制御できるユーザーに依存しますが、念のため常にバインドされたパラメーターを使用する必要があります)。

于 2013-01-05T21:33:35.687 に答える
0

Tometzkyで+1すると、不規則な複数形を避けるために、単数形を使用して平易な英語でテーブルに名前を付ける方がよいと付け加えます(これは私の見解ですが、インターネットで助けを求めるときははるかに簡単で、私は英語のネイティブスピーカーではありませんまた)。

Pommのような既存のオブジェクトモデルマネージャーを使用すると、作業がずっと楽になります。本番環境でPostgresqlを使用していることがわかっている場合は、そのオブジェクト指向機能を利用して、結合全体を1つのクエリでフェッチすることをお勧めします。

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 に答える