2013-02-27 67 views
-2

为什么连接使用包含一次失败与pdo?
当我连接到包含连接页面的数据库时,它给了我一个错误,但是当我将连接代码放入并删除include时,我不会收到错误。可能是什么问题?为什么连接使用包含一次失败与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; 
+2

哪里代码的其余部分?你至少缺少'$ con> prepare()' – sjdaws 2013-02-27 10:10:15

+0

你能确保文件被正确包含吗?两个文件都在同一个目录中吗? – Minesh 2013-02-27 10:10:52

+0

@Minesh是的,他们都在同一个目录 – humphrey 2013-02-27 10:13:25

回答

1

您不能在全球范围内创建一个函数变量全局。变量$con长期被GC'ed:函数返回后,它被释放。试试这个:如果你坚持使用global关键字,这是一个伟大的想法

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

,您应该已经使用这样的:

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

正如你所看到的,我有类似欺骗和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',''); 

这样的话,你不调用不需要被调用的函数。

+0

-1捕获并回显错误 – 2013-02-27 10:21:24

+0

@YourCommonSense:解决了问题,并且根本不使用函数调用添加了_not_建议。 Try-Catch-Echo构造是OP的复制粘贴... – 2013-02-27 10:25:10

+0

好大的帮助赞赏我仍然比较答案,但你的是最相关的 – humphrey 2013-02-27 10:30:57

2

你从来不$con提供的功能connected_Db之外。了解有关variable scope。你应该从功能return它,使用它,像这样:

require_once 'pdo.inc.php'; 

$con = connected_Db(); 

这也意味着你不应该catch连接错误(至少不存在),因为如果函数不能返回一个PDO连接你的脚本没有按不需要继续。

+1

+1为“你不应该赶上”。 – 2013-02-27 10:17:58

1

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

例如

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()); 
    } 
} 
+2

-1捕获和死亡 – 2013-02-27 10:20:22

+0

这是一个简单的例子,如何使用'global'。退出脚本是否正确无误取决于开发人员。如果所有函数都要调用“new PDO()”并返回结果,那么函数就不需要了,如果你想要挑剔,那么'echo'就可能不属于那里。 – 2013-02-27 10:22:52

+0

您的回答首先对我感谢,让我测试其他人的回答然后我会决定“赞赏” – humphrey 2013-02-27 10:24:25

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); 
} 

(你也不妨通过传递函数参数连接选项)

其他文件

​​
+1

对不起,但_“只是从手册页复制粘贴”_?我不会复制粘贴,以免我提到源代码。我复制了OP的代码,并将其赋值为return语句。在您刚发表评论之后,我还删除了try-catch块。我忍不住发现你的指责有点冒犯 – 2013-02-27 10:38:39

+0

@你的常识你总是会找到最好的答案,而我现在正在使用你,因为我觉得保存你的答案并且它可以100%的工作 – humphrey 2013-02-27 10:41:27

+0

@Elias上校通常是有攻击性,但他通常也是对的。 ;) – deceze 2013-02-27 10:42:17