7

同じ結果を達成する方法がたくさんある場合、mysql接続を初期化する最も効率的な方法はどれか疑問に思います。

注:最近、PHPのドキュメントで、mysql_connectが非推奨になっていることもわかりました。現在、すべてのコードでmysql_connectが使用されています。切り替える十分な理由はありますか?

私がやろうとしていることは:

  1. database.phpを作成します。
  2. データベースに接続するPHPページにはこのファイルが含まれているため、データベースに接続するために多くのコードを記述する必要はありません。

したがって、最も効率的にするために、このdatabase.phpは何をすべきでしょうか。

1. $con = mysql_connect("etc"...)
   mysql_select_db("databse")

//ここから、このファイルを含めてクエリを開始できます。-動作しますが、それが最善の方法かどうかはわかりません。

2. //database.php
   $mysqli = new mysqli('localhost', 'user', 'pwd', 'database');
   // in other files
   $mysqli->query("SELECT ...")
  1. または、持続的接続を使用する必要がありますか?(このサイトはデータベースが非常に多く、ページが大量に生成され、同時にログインするユーザーは100人以下になります)

前もって感謝します

4

5 に答える 5

6

今日、コード内のMySQL拡張機能のすべての機能をPDOに変更しました。

最も柔軟にするには、次のような一般的な接続で「database.php」を作成する必要があります。

<?php
$pdo = new PDO('mysql:host=example.com;dbname=database;charset=UTF-8', 
               'username', 
               'password');

次に、他のページで、require()次のようなファイルを含めるために使用します。

<?php
require('database.php');

// Example with 'query'
$queriedSQL = $pdo->query('SELECT * FROM table');

// Example with 'prepare'
$preparedSQL = $pdo->prepare('SELECT * FROM other_table WHERE id = ?');
$preparedSQL->setFetchMode(PDO::FETCH_ASSOC);

while($result = $queriedSQL->fetch(PDO::FETCH_ASSOC)) {
  $preparedSQL->execute(array($result['id']));
  $preparedSQLResult = $preparedSQL->fetch();
  // Process code here
}

別の方法では、「index.php」をコアとして作成し、URLを処理するか$_GET[]、対応するファイル(すべてのCMSシステム、Wordpressなど)を含めることができます。

そうすれば、一部のデータ(ホスト、ユーザー名、パスワード、データベース名)が変更されたときにコードの量を変更することを回避できます。

持続的接続については、PHPで許可されていますが、ここにあるような欠点があります。

于 2012-06-11T04:12:47.837 に答える
3

最初にすべきことは、mysql.config.phpファイルを作成することです。

<?php
define('MYSQL_HOST','');
define('MYSQL_USER','');
define('MYSQL_PASSWORD','');
define('MYSQL_DATABASE','');
?>

次に行うべきことは、すべてのデータベース接続の詳細を処理するmysql.class.phpファイルを作成することです(この動作をエミュレートします)。新しい関数を追加するだけで、numRows関数などの機能を拡張できます。

<?php
require_once 'mysql.config.php';
class MySQL {
private $query;
private $result;
public function __construct($host = MYSQL_HOST, $user = MYSQL_USER, $password = MYSQL_PASSWORD, $database = MYSQL_DATABASE) {
    if (!$con = mysql_connect($host,$user,$password)) {
        throw new Exception('Error connecting to the server');
    }
    if (!mysql_select_db($database,$con)) {
        throw new Exception('Error selecting database');
    }
}
public function query($query) {
    $this->query = $query;
    if (!$this->result = mysql_query($query)) {
        throw new Exception('Error performing query '.$query);
    }
}
public function numRows() {
    if ($this->result) return mysql_num_rows($this->result);
    return false;
}
}
?>

最後に行う必要があるのは、アプリでこれらのファイルを使用することです。

<?php
require_once 'mysql.class.php';
try {
    $db = new MySQL();
    $db->query('SELECT username FROM login WHERE username = "'.$USERNAME.'" LIMIT 1');
    if ($db->numRows() == 1) print_json(array('user'=>true),true);
    else print_json(array('user'=>false),true);
} catch(Exception $e) {
    echo $e->getMessage();
    exit();
}
?>
于 2012-06-11T04:01:26.880 に答える
1

このサイトはデータベースが多いため、データベース接続にはPDOを使用することをお勧めします。また、PHP-MySQLトラフィックを減らすために、複数のクエリにトランザクションを使用します。

詳細はこちら:http ://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html

于 2012-06-11T04:02:03.340 に答える
1

PHPプログラミング言語に関連して、MySQLは古いデータベースドライバーであり、MySQLiは改良されたドライバーです。MySQLiは、MySQL5の新機能を利用しています。php.netサイトから逐語的に削除されました。

  • オブジェクト指向インターフェース
  • プリペアドステートメントのサポート
  • 複数のステートメントのサポート
  • トランザクションのサポート
  • 強化されたデバッグ機能
  • 組み込みサーバーのサポート基本的に、mysql、mysqli、またはPDOを使用することを選択できます。

単にリレーショナルデータベースを探しているのであれば、MySQL以外に探す必要はありませんが、利用できるオプションはたくさんあります。

于 2012-06-11T04:04:04.660 に答える
0

RE:「持続的接続を使用する必要があります」

いいえ。データベースが「重い」場合、永続的な接続は実際には役に立ちません。実際、データの処理中に長時間開いたままになるPHPスクリプトを妨げる可能性があります。持続的接続は、一部の状況でのみデータベースに接続する時間を短縮するだけです。スクリプトの実行ごとに数ミリ秒節約できる場合がありますが、注意深く記述しない限り、ロックまたはトランザクションを解放するためのクリーンアップ関数の実行が失われます。したがって、非常に短いスクリプトがたくさんあり、短くて鋭いdb接続を取得して次に進む場合、またはDBサーバーがWebサーバーから遠く離れている場合を除いて、この点に気を配らないでください。

PDOは他の回答でも提案されているので、あなたに最適になるようにマークアップしました。

于 2012-06-11T04:15:05.600 に答える