0

先发制人的道歉:这篇文章包含基本问题。但是,我已经搜索过,我没有找到答案,如果有一个......对不起。

我正在关注一些用于制作基本 ajax 网络聊天的 youtube 教程,并且在教程中,该人正在使用 MySQLi 连接到数据库。我想创建相同的 ajax 聊天应用程序,但我想使用 PDO 而不是 MySQLi。

该人使用这两个文件:

配置文件

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

聊天类.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 示例?为什么我没有看到 __construct() 与 PDO 一起使用?

一些小问题......当与用户一起创建网站时,是否有存储数据库连接的标准位置?有什么书推荐吗?

抱歉所有这些问题,非常感谢所有帮助!

4

5 回答 5

1

要回答您的问题:

首先我很困惑他为什么在一个单独的文件中定义这些东西

身份验证详细信息在第二个文件中定义,因为如果您创建另一个查询脚本,现在两个脚本都可以包含身份验证详细信息。如果认证细节发生变化,您只需更新一个文件。如果您只是在编写一个简单的应用程序,那么将所有内容都保存在一个文件中。

但是他为什么要把这些东西放在一个数组中

我认为这只是在脚本中其他人需要身份验证详细信息的情况下完成(很像第一个示例中定义的全局变量)。将参数定义为变量通常是最佳实践(即使您使用该变量一次)。这样,如果你打错了一个变量,你会得到一个错误;而不是一遍又一遍地复制和粘贴相同的字符串。

为什么我没有看到 __construct() 与 PDO 一起使用

当你在 PHP 中创建一个新对象时,你不需要调用 __construct,它会通过“new”语句自动调用。

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

与用户一起创建网站时,是否有存储数据库连接的标准位置

一定要确保身份验证详细信息存储在公众无法访问的文件中。连接对象对公众访问没有任何危害(当然,除非您需要在建立数据库连接之前对客户端(网站用户)进行身份验证)。最好的做法是始终以以下方式开始您的(安全)PHP 文件:

<?php

但是......永远不要以“?>”结束文件。如果在“?>”之后意外插入了一个额外的字符,您的 Web 服务器可能会向全世界显示您的整个脚本(当然您的 Apache 等...必须配置错误)。就像我说的......最佳实践。

有什么书推荐吗?

谷歌搜索“php 架构最佳实践”可能会有所帮助。

于 2013-08-22T18:59:02.623 回答
0

您混淆了太多可以在一个答案中解释的事情。你甚至不知道该问什么。

请不要将编程艺术视为一种可以在 2 小时内学会的廉价技巧。要编写基于 AJAX 的聊天,至少需要学习几个月。通过理解来学习,而不是通过复制粘贴来学习。要一步一步地学习,从变量到数组,从数组到函数,从函数到类等等——而不是把他们找到的所有代码都扔在一个碗里,然后问如何处理所有这些。如果不了解前一个步骤,就无法进入另一个步骤。当然,所有这些 youtube 教程都是无用的垃圾。

你的一些困惑是:

__construct()方法实际上与 PDO 无关。也不用mysql。这是一个聊天类方法。和方法都是错误的。聊天类不应创建自己的连接,而应使用已创建的连接。

变量与数组与常量的这件事并不重要。在单独的文件中包含连接选项是一件好事,但您也需要在单独的文件中包含连接代码,以避免在每个文件中编写连接代码。

您不应该try catch 块中使用此代码(除非您知道在发生错误时该怎么做,我怀疑您是否知道)。

在开始聊天之前,您必须学习更小、更简单的应用程序,例如电话簿等,以学习基本的数据库操作,然后您将能够从中构建任何应用程序,就像任何房子都可以用砖砌成一样。

您可以在此处的标签 wiki 中获得 PDO 基础知识。但是 OOP 基础并不是那么容易。

于 2013-08-22T20:15:47.673 回答
-1

Why not just do:

<?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!";
}   
?>

In a separate PHP file I call mine dbPDO.php and then have:

require_once("dbPDO.php");

In your PHP pages. And then run queries by doing:

EDIT: to condense my answer.

$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'];
}

Make sure you bindParam and use the ':' in the query. Don't just put WHERE username = $username or WHERE username = $_POST['username'] That would led you prone to SQL Injection. Also, I didn't show it here, but you should have some sort of exemption handling for each query. I place the whole query in a Try/Catch, but I hear there are other ways to deal with it. I personally think its personal preference.

于 2013-08-22T18:47:49.450 回答
-1

First of all you don't need an array nor variables, you can directly input the configuration..like:

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

  }

Secondly _constructor() means that whenever the class Chat is called everything in the _constructor() is executed .

Here is a good tutorial for PDO http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

于 2013-08-22T18:49:07.430 回答
-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 回答