2

4 つのフィールドを持つ mySQL データベース テーブルがあるとします。

  • link_id (主キー)
  • page_id
  • アンカーテキスト
  • URL

私のデータは次のようになります。

link_id | page_id | anchor_text | url 
1       | 1       | Link One    | http://www.one.com
2       | 1       | Link Two    | http://www.two.com
3       | 2       | Link Three  | http://www.three.com

特定のページへのリンクを取得する関数を作成し、その関数を使用してそれらを表示するにはどうすればよいでしょうか?

関数:

    function get_page_links($page_id) {

        $db = new mysqli("localhost", "root", "root", "my_db");

        //what's next?

        }

使用法:

$my_links = get_page_links(1);

//do something to parse $my_links

画面:

<a href="http://www.one.com">Link One</a>
<a href="http://www.two.com">Link Two</a>
4

2 に答える 2

2
$q = "SELECT *";
$q.= " FROM yourtablename";
$q.= " WHERE `page-id` = ".(int)$page_id;
$q.= " ORDER BY `link-id`";

バックティックは必要ないかもしれませんが、フィールド名にハイフンが含まれているので、そこにバックティックを入れています。

ここでは非常に基本的な検証が行われていることに注意してください。追加する前にintにキャスト$page_idすることで、ある種のインジェクション攻撃にならないようにします。これはそれを行うための優れた方法ではありませんが、機能します。

のようなものmysqli_real_escape_string()は、特により一般的な消毒のために考慮されるべき代替案です。

または:

$q = sprintf("SELECT *
              FROM yourtablename
              WHERE `page-id` = %d
              ORDER BY `link-id", $page_id);

どちらが好きですか。


再編集:今何?

まず、mysqliを使用せず、PDOを使用します。

次に、関数を呼び出すたびにデータベースに接続する必要はありません。これを1回実行します。したがって、これを関数の外に移動します。

// Typically this line is in another file and included once, but for now lets just
//  get this out of the function
$db = new PDO('mysql:host=localhost;dbname=my_db', 'root', 'root');

// Your function
function get_page_links($page_id) {
    // Build query
    $q = sprintf("SELECT *
                  FROM yourtablename
                  WHERE `page-id` = %d
                  ORDER BY `link-id`", $page_id);
    // Run Query
    foreach ($db->query($q) as $a) {
        printf('<a href="%s">%s</a>'."\n", $a['url'], $a['anchor-text']);
    }
}
于 2012-06-16T17:38:42.460 に答える
2

私にとってはかなり単純なクエリのように見えます

SELECT *
    FROM `links_table`
    WHERE `page_id` = $page_id
    ORDER BY `link_id` ASC;

もちろん、これは$page_idユーザー入力からのものではなく、安全にサニタイズされていることを前提としています。そうでない場合は、プリペアドステートメントを使用する必要があります。

このクエリが生成する結果を処理する方法については、MySQLiでのステートメントの実行についてお読みください。


私はPDOを好むので、MySQLiに習熟していません。PDOでは、次のようなことをしていました。

<?php

/**
 * @param integer $page_id
 * @param PDO     $db
 *
 * @return array
 */
/*
 * First, we give the function the database connection object as an argument.
 * A function to get the page links shouldn't care where you got the connection from!
 */
function get_page_links($page_id, PDO $db) {
    $query = <<<MySQL
SELECT *
    FROM `links_table`
    WHERE `page_id` = :page_id
    ORDER BY `link_id` ASC;
MySQL;
    /*
     * Prepare the query and bind all values to placeholders
     */
    $stmt  = $db->prepare($query);
    $stmt->bindValue(":page_id", $page_id, PDO::PARAM_INT);

    $stmt->execute();

    /*
     * Fetch all results to an array, and return it
     */
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $result;
}

try {
    /*
     * Start new PDO connection for the function
     */
    $db = new PDO("mysql:host=localhost;dbname=database_name", "user", "password");
    //This line tells PDO to throw PDOExceptions in case of errors,
    //which are much easier to handle
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //This lines disables PDO's default emulation for prepared statements. Adds security.
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $links = get_page_links(1, $db);
}
catch (PDOException $e) {
    die("There has been an error with the database: " . $e->getMessage());
}

foreach ($links as $link) {
    echo "<a href='{$link["url"]}'>{$link["anchor_text"]}</a>";
}
于 2012-06-16T17:39:41.570 に答える