Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO连接到MySQL数据库_Php_Mysql_Pdo_Database Connection - Fatal编程技术网

Php 使用PDO连接到MySQL数据库

Php 使用PDO连接到MySQL数据库,php,mysql,pdo,database-connection,Php,Mysql,Pdo,Database Connection,先发制人的道歉:这篇文章包含一些基本的问题。但是,我已经搜索过了,我没有找到答案,如果有…对不起 我正在跟随一些youtube教程来进行基本的ajax网络聊天,在教程中,这个人正在使用MySQLi连接到数据库。我想创建相同的ajax聊天应用程序,只是我想使用PDO而不是MySQLi 此人使用以下两个文件: config.php <?php define('DB_HOST', 'localhost'); define('DB_USER', 'bucky_chat'); defin

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

我正在跟随一些youtube教程来进行基本的ajax网络聊天,在教程中,这个人正在使用MySQLi连接到数据库。我想创建相同的ajax聊天应用程序,只是我想使用PDO而不是MySQLi

此人使用以下两个文件:

config.php

<?php
  define('DB_HOST', 'localhost');
  define('DB_USER', 'bucky_chat');
  define('DB_PASSWORD', '123456');
  define('DB_NAME', 'bucky_chat');
?>`   
<?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();
    }

}

?>
`
chat.class.php

<?php
  define('DB_HOST', 'localhost');
  define('DB_USER', 'bucky_chat');
  define('DB_PASSWORD', '123456');
  define('DB_NAME', 'bucky_chat');
?>`   
<?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一起使用

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


对于所有这些问题,我们深表歉意,非常感谢您的帮助

首先,在不同的文件中定义config的原因是,您可以在需要访问数据库的任何时候包含该文件,而不是写入数据库配置。这是首选的最佳实践

你可以做:

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
}
为什么不干脆做:

<?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页面中。然后通过执行以下操作运行查询:

编辑:浓缩我的答案

$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并在查询中使用“:”。不要只把username=$username或username=$\u POST['username']放在容易导致SQL注入的地方。另外,我没有在这里显示它,但是您应该对每个查询进行某种豁免处理。我将整个查询放在一个Try/Catch中,但我听说还有其他方法来处理它。我个人认为这是个人偏好

首先,您不需要数组或变量,可以直接输入配置..如:

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

  }
其次,
\u constructor()
意味着每当调用类
Chat
时,\u constructor()中的所有内容都会执行


这里有一个很好的PDO教程,可以回答您的问题:

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

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

但他为什么要把这些东西放在一个阵列里

我认为这样做只是为了防止脚本中的其他人需要身份验证详细信息(很像第一个示例中定义的globals)。将参数定义为变量(即使只使用一次变量)通常是最佳做法。这样,如果你输入了一个变量,你会得到一个错误;而不是一次又一次地复制和粘贴相同的字符串

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

在PHP中创建新对象时,不需要调用_构造,它会用“new”语句自动调用

$PDOConnection = new PDO($dsn, $username, $password);
当与用户一起创建网站时,是否有标准的位置来存储数据库连接

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

<?php

你把一个答案可以解释的事情弄得太多了。你甚至不知道该问什么

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

你的一些困惑是:

\uu construct()
方法实际上与PDO无关。mysql也是如此。这是一个聊天类方法。方法都是错的。聊天类不应该创建自己的连接,而应该使用已经创建的连接

变量、数组和常量之间的关系其实并不重要。在单独的文件中具有连接选项是一件好事,但您仍然需要在单独的文件中具有连接代码,以避免在每个文件中写入连接代码

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

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


PDO基础知识您可以在这里获得,但OOP基础知识并不是那么容易。

更容易在一个数组中拖动一组值,而不是一组单独的变量。如果我尝试将不同的用户连接到数据库,该怎么办?不是