0

先制的な謝罪: この投稿には基本的な質問が含まれています。ただし、検索しても回答が見つかりませんでした。

基本的な ajax Web チャットを作成するためのいくつかの youtube チュートリアルに従っています。チュートリアルでは、MySQLi を使用して DB に接続しています。MySQLi の代わりに PDO を使用する以外は、同じ ajax チャット アプリケーションを作成したいと考えています。

この人物は、次の 2 つのファイルを使用します。

config.php

<?php
  define('DB_HOST', 'localhost');
  define('DB_USER', 'bucky_chat');
  define('DB_PASSWORD', '123456');
  define('DB_NAME', 'bucky_chat');
?>`   

chat.class.php

<?php
   require_once('config.php');
   require_once('error_handler.php');

class Chat {

    private $mysqli;

    //constructor opens DB connection
    function __construct(){
        $this->mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    }

    //destructor closes db connection
    function __destruct(){
        $this->mysqli->close();
    }

}

?>

上記のスニペットを PDO で複製しようとしています。問題は、これを行うために私が見た PDO の例をどのように適応させるかがよくわからないことです。

まず第一に、なぜ彼がこれらのものを別のファイルで定義したのかについて混乱しています..これを行うことには何か利点がありますか?

私が見ている別の PDO チュートリアルでは、次の方法で実行できることがわかります。

<?php
$config['db'] = array(
'host' => 'localhost',
'username' => '',
'password' => '',
'dbname' => ''
);

$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['db_name'], $config['db']['username'], $config['db']['password']);
//some code
$db = null; //closes connection
?>

`

これは私が (try catch ブロックで) 使用する必要があると思いますが、なぜ彼はこれらのものを配列に入れるのでしょうか? 物事を複雑にしすぎているようです...変数だけではないのはなぜですか? しかし、このコードは mysqli の例を再現していますか? PDO で __construct() が使用されていないのはなぜですか?

いくつかの小さな質問... ユーザーと一緒に Web サイトを作成する場合、DB 接続を格納する標準的な場所はありますか? 本のおすすめは?

これらすべての質問で申し訳ありませんが、すべての助けに強く感謝します!

4

5 に答える 5

1

質問に答えるには:

まず第一に、なぜ彼がこれらのものを別のファイルで定義したのか混乱しています

別のクエリ スクリプトを作成すると、両方のスクリプトに認証の詳細を含めることができるため、認証の詳細は 2 番目のファイルで定義されます。認証の詳細が変更された場合、1 つのファイルのみを更新する必要があります。単純なアプリケーションを作成する場合は、すべてを 1 つのファイルに保存するだけでは不十分です。

しかし、なぜ彼はこれらのものを配列に入れるのですか

これは、認証の詳細がスクリプト内の他の誰かに必要な場合に備えて行われていると思います (最初のサンプルで定義されたグローバルのように)。多くの場合、パラメーターを変数に定義するのがベスト プラクティスです (変数を 1 回使用する場合でも)。このように、変数をタイプミスすると、エラーが発生します。同じ文字列を何度もコピーして貼り付けるのとは対照的です。

PDO で使用されている __construct() が表示されない理由

PHP で新しいオブジェクトを作成するときはいつでも、__construct を呼び出す必要はありません。それは "new" ステートメントで自動的に呼び出されます。

$PDOConnection = new PDO($dsn, $username, $password);

ユーザーで Web サイトを作成する場合、DB 接続を保存する標準的な場所はありますか

認証の詳細が公開されていないファイルに保存されていることを必ず確認してください。接続オブジェクトは、一般ユーザーがアクセスしても害はありません (もちろん、データベース接続を確立する前にクライアント (Web サイトのユーザー) を認証する必要がある場合を除きます)。(安全な) PHP ファイルを常に次のように開始することをお勧めします。

<?php

しかし...「?>」でファイルを終わらせないでください。誤って "?>" の後に余分な文字が挿入された場合、Web サーバーはスクリプト全体を世界中に表示する可能性があります (もちろん、Apache などは間違って設定する必要があります)。私が言ったように...ベストプラクティス。

本のおすすめは?

「phpアーキテクチャのベストプラクティス」をグーグルで検索すると役立つ場合があります。

于 2013-08-22T18:59:02.623 に答える
0

あなたは、1つの答えで説明できることをあまりにも多く混乱させています。あなたは何を尋ねるべきかさえ知りません。

プログラミングの技術を、2 時間で学べる安っぽいトリックだと思わないでください。AJAX ベースのチャットを作成するには、少なくとも数か月は学習する必要があります。コピペではなく理解することで学ぶ。変数から配列、配列から関数、関数からクラスなどを段階的に学習するには、見つけたすべてのコードを 1 つのボウルに投げ込んで、SO にそのすべてを処理する方法を尋ねるのではありません。前のステップを理解しなければ、次のステップに進むことはできません。そしてもちろん、これらすべての YouTube チュートリアルは、役に立たないごみの決定的な部分です。

あなたの混乱のいくつかは次のとおりです。

__construct()メソッドは実際には PDO とは何の関係もありません。mysqlでもありません。これは Chat クラスのメソッドです。そして、すべて間違っている方法。Chat クラスは独自の接続を作成するのではなく、作成済みの接続を使用する必要があります。

変数対配列対定数に関するこのことは、実際には問題ではありません。別のファイルに接続オプションを含めることは良いことですが、すべてのファイルに接続コードを記述することを避けるために、別のファイルにも接続コードを含める必要があります。

このコードを try catch ブロックで使用しないでください(エラーが発生した場合に何をすべきかを知っている場合を除きます)。

チャットを開始する前に、電話帳などのより小さくて単純なアプリケーションを学習して、基本的なデータベース操作を学習する必要があります。これにより、後で任意の家がレンガで構築できるように、任意のアプリケーションを構築できるようになります。

PDO の基本は、ここのタグ wikiで入手できます。しかし、OOP の基本はそれほど簡単ではありません。

于 2013-08-22T20:15:47.673 に答える
-1

まず、配列も変数も必要ありません。構成を直接入力できます..のように:

  try { //try connection

    //common db
    $db = new PDO('mysql:host=localhost;dbname=some_db_name', 'some_usernane', 'some_pass');

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


  } catch (Exception $e) { //connection failed

    die("Oh no! It seems we took too long to respond, we are sorry for that..");

  }

次に_constructor()、クラスChat が呼び出されるたびに _constructor() 内のすべてが実行されることを意味します。

ここに PDO の優れたチュートリアルがあります http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

于 2013-08-22T18:49:07.430 に答える
-1

なぜそうしないのですか:

<?php
$hostname = 'host';
$dbname = 'dbname';
$username = 'uname';
$password = 'pw';

try {
$db = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}
catch (PDOException $ex) {
    echo "An Error occurred!";
}   
?>

別の PHP ファイルで、私の dbPDO.php を呼び出して、次のようにします。

require_once("dbPDO.php");

PHP ページで。そして、次のようにしてクエリを実行します。

編集:私の答えを要約します。

$username = $_POST['username'];
$stmt = $db->prepare("SELECT field1, field2, field3, etc FROM mytable WHERE username = :username");
$stmt->bindParam(':username', $username);
$stmt->execute();
    while ($r = $stmt->fetch()) {
    $field1 = $r['field1'];
    $etc = $r['etc'];
}

必ず bindParam を使用し、クエリで「:」を使用してください。単に WHERE username = $username または WHERE username = $_POST['username'] を入力しないでください。これにより、SQL インジェクションが発生しやすくなります。また、ここでは示しませんでしたが、クエリごとになんらかの例外処理が必要です。クエリ全体を Try/Catch に配置しましたが、他の方法で処理できると聞きました。私は個人的には個人的な好みだと思います。

于 2013-08-22T18:47:49.450 に答える
-1

まず、別のファイルで構成を定義する理由は、データベースにアクセスしたいときにデータベース構成を書き込む代わりに、そのファイルを含めることができるようにするためです。これは推奨されるベスト プラクティスです。

できるよ:

try 
{
  $PDOConnection = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', DB_USER, DB_PASS);
  $PDOConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  //Do you stuffs

  $PDOConnection = null;
} 
catch(PDOException $e) 
{
  //Do something with error
}
于 2013-08-22T18:44:08.847 に答える