为什么连接使用包含一次失败与pdo失败?

时间:2013-02-27 10:07:48

标签: php mysql pdo

为什么连接使用包含一次失败并使用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 个答案:

答案 0 :(得分:2)

您永远不会在函数$con之外提供connected_Db。了解variable scope。你应该从函数return使用它并像这样使用它:

require_once 'pdo.inc.php';

$con = connected_Db();

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

答案 1 :(得分: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();

答案 2 :(得分:1)

您无法从全局范围创建全局功能变量。变量$con长期以来一直是GC:它在函数返回后被释放。试试这个:

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

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

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','');

这样,你就不会调用一个不需要调用的函数。

答案 3 :(得分:1)

您错误地使用了global。它应该进入函数,以指定变量来自函数外部,即在全局范围内。

e.g。

function connected_Db()
{
    global $con;

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

但最好还是退回连接,而不是从全局范围内引入连接。

function connected_Db()
{
    try
    {
       return new PDO(...);
    }
    catch(PDOException $e)
    {
        die('Could not connect: '.$e->getMessage());
    }
}