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