-2

为什么使用包含连接一次会因 pdo 失败?
当我连接到包含连接页面的数据库时,它给了我一个错误,但是当我将连接代码放入并删除包含时,我没有收到错误。可能是什么问题?

Error Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\tish\A\view.php on line 167

连接页面:

<?php
  function connected_Db(){
    try {
      $con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');
    } catch(PDOException $e){
      echo 'Connection failed'.$e->getMessage();
    }
  }
  connected_Db();
?>

我将其包含在其他页面中的方式:

include_once('pdo.inc.php');
connected_Db();
global $con;
4

4 回答 4

2

你永远不会$con在函数之外使用connected_Db。了解变量范围。您应该return从函数中使用它并像这样使用它:

require_once 'pdo.inc.php';

$con = connected_Db();

这也意味着您不应该出现catch连接错误(至少不存在),因为如果函数无法返回 PDO 连接,您的脚本就不需要继续。

于 2013-02-27T10:11:03.000 回答
2

首先,您需要告诉 PDO 在连接错误时抛出异常。
接下来,你不应该抓住它们,至少不要使用 try .. catch。

所以,代码必须是

pdo.inc.php:

<?php
function connected_Db(){
    $dsn  = 'mysql:host=localhost;dbname=tish_database;charset=utf8';
    $opt  = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    return new PDO($dsn,'root','', $opt);
}

(您可能还希望通过函数参数传递连接选项)

其他文件

include_once('pdo.inc.php');
$con = connected_Db();
于 2013-02-27T10:28:20.500 回答
1

您不能在全局范围内使函数变量成为全局变量。该变量$con早已被 GC 处理:一旦函数返回,它就会被释放。试试这个:

function connected_Db()
{
   return new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');
}
//global scope:
$con = connect_Db();

如果你坚持使用global关键字,这不是一个好主意,你应该这样使用它:

function connected_Db()
{
    global $con;//use the global var, set at top of function
    $con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');
}
$con = null;// declare global var (optional, but a notice will be issued if not declared)
connect_Db();
var_dump($con);

正如你所看到的,我已经 - 像 deceze 和 YourCommonSense 建议 - 删除了 try-catch 块(你在这里不需要)。它还表明您也不需要函数调用。如果您要编写以下代码,您的脚本将运行得非常好(甚至稍微快一点):

//global scope (or whatever scope you need it to be)
$con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');

这样,您就不会调用不需要调用的函数。

于 2013-02-27T10:13:38.870 回答
1

你使用global不正确。它应该进入函数,以指定变量来自函数外部,即在全局范围内。

例如

function connected_Db()
{
    global $con;

    $con = null;
    try
    {
       $con = new PDO(...);
    }
    catch(PDOException $e)
    {
        die('Could not connect: '.$e->getMessage());
    }
}

但是最好返回连接而不是从全局范围内拉它。

IE

function connected_Db()
{
    try
    {
       return new PDO(...);
    }
    catch(PDOException $e)
    {
        die('Could not connect: '.$e->getMessage());
    }
}
于 2013-02-27T10:19:27.123 回答