Php 为什么即使在I';你在上面连接了吗?

Php 为什么即使在I';你在上面连接了吗?,php,Php,为什么即使在连接之后,我与数据库的连接仍不能正常工作 这是我存储连接的文件:dbase.php <?php function connect() { try { $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'',DB_USER,DB_PASSWORD); $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_S

为什么即使在连接之后,我与数据库的连接仍不能正常工作

这是我存储连接的文件:
dbase.php

<?php
function connect()
{
    try
    {   
        $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'',DB_USER,DB_PASSWORD);
        $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

    }catch(PDOException $e) 
    {
        echo 'Error in reaching database: '.$e->getMessage();
        #Send an email to the admin
        #Display the error page
        die();
    }
        return $conn;
}
?>
甚至当我在上面的页面中连接到数据库时,当脚本调用函数时,我也会得到:
注意:第25行的C:\web\apache\htdocs\index.php中的未定义变量:conn致命错误:在第25行的C:\web\apache\htdocs\index.php中的非对象上调用成员函数prepare()。我已在文件中标记了第25行。

为什么会发生这种情况,我该如何解决呢?`

改变

function fetchElements($one,$two)
{ 
   ...

改变


$conn
作为
fetchElements
函数中的参数传递到此处

function fetchElements($one,$two, $conn) {
然后分配到这里

fetchElements($row['level'],$row['id'], $conn);

不要在
fetchElements
函数中使用在此处传递
$conn
作为参数

function fetchElements($one,$two, $conn) {
然后分配到这里

fetchElements($row['level'],$row['id'], $conn);
不要使用全局变量(如
$conn
)在函数中不会自动可用

你有两种方法:

A:将变量作为函数参数传递:

function fetchElements($conn,$one,$two)
{
....
}
调用
fetchElements($conn,$1,$2)

B:使用
global
关键字:

function fetchElements($one,$two)
{
    global $conn;
    ....
}
方法A更灵活、更好(在我看来),因为例如,您可以有多个PDO连接,并且可以在每次调用的基础上决定函数应该使用哪一个连接。

全局变量(如
$conn
)在函数中不会自动可用

你有两种方法:

A:将变量作为函数参数传递:

function fetchElements($conn,$one,$two)
{
....
}
调用
fetchElements($conn,$1,$2)

B:使用
global
关键字:

function fetchElements($one,$two)
{
    global $conn;
    ....
}

方法A更灵活、更好(在我看来),因为例如,您可以有多个PDO连接,并且可以在每次调用的基础上决定函数应该使用哪一个连接。

问题是,这样做不会再次启动新连接吗?我已经在脚本开头连接了…@Norman不会的。它只是使变量(
$conn
)可以在函数中访问。没有
global
它超出了范围。问题是,这样做不会再次启动新连接吗?我已经在脚本开头连接了…@Norman不会的。它只是使变量(
$conn
)可以在函数中访问。没有
global
它超出了范围。问题是,这样做不会再次启动新连接吗?我已经在脚本开头连接了…不,
$conn
只是对PDO对象的引用。事实上,使用
global
总是将函数内外的变量粘在一起(也就是说,在函数中更改变量,同时在函数外部更改变量)。但是,除非您特别使用
clone
关键字,否则对象总是被引用的,而不是被复制的。问题是,这样做不会再次启动新连接吗?我已经在脚本开头连接了…不,
$conn
只是对PDO对象的引用。事实上,使用
global
总是将函数内外的变量粘在一起(也就是说,在函数中更改变量,同时在函数外部更改变量)。但是,除非您专门使用
clone
关键字,否则对象总是被引用的,而不是被复制的。