Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在PHP中将$db作为全局变量传递_Php_Mysql_Pdo - Fatal编程技术网

Can';t在PHP中将$db作为全局变量传递

Can';t在PHP中将$db作为全局变量传递,php,mysql,pdo,Php,Mysql,Pdo,我想知道为什么我不能在PHP中这样做 DB.PHP function db_connect(){ try { $db = new PDO('xxxxxxxx'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo $e->getMessage(); }

我想知道为什么我不能在PHP中这样做

DB.PHP

function db_connect(){
    try {
        $db = new PDO('xxxxxxxx');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
    }
    return $db;
}
require_once('db.php');
$db = db_connect();

//Incoming AJAX request

if(isset($_POST['rowId'])) $rowId = $_POST['rowId'];
if(isset($_POST['func'])){
    $func = $_POST['func'];
    switch($func){  
        case "info":
            echo json_encode(info($rowId));
        break;
    }
}

function info($rowId){
  global $db;
  $rowInfo = $db->prepare("SELECT name FROM table WHERE id = :rowId");
  $rowInfo->bindParam(':rowId', $rowId);
  $rowInfo->execute();
//do more stuff
FUNCTION.PHP

function db_connect(){
    try {
        $db = new PDO('xxxxxxxx');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
    }
    return $db;
}
require_once('db.php');
$db = db_connect();

//Incoming AJAX request

if(isset($_POST['rowId'])) $rowId = $_POST['rowId'];
if(isset($_POST['func'])){
    $func = $_POST['func'];
    switch($func){  
        case "info":
            echo json_encode(info($rowId));
        break;
    }
}

function info($rowId){
  global $db;
  $rowInfo = $db->prepare("SELECT name FROM table WHERE id = :rowId");
  $rowInfo->bindParam(':rowId', $rowId);
  $rowInfo->execute();
//do more stuff
我得到这个错误

可捕获的致命错误:类PDO的对象无法转换为字符串

我可以用两种方法解决它

  • 不要使用任何绑定参数(这在这里显然是无用的)
  • $db
    传递到函数中

  • 有什么问题?错误发生在execte()上。我可以删除它之后的任何内容,但仍然会收到错误。

    因此$rowID包含一个对象

    execute函数尝试将消息对象转换为字符串,但发现没有声明uuu toString函数

    所以要么宣布

    public function __toString() {
       return $the_string;
    }
    

    或者创建另一个可以传递给执行函数的公共函数/成员。

    @mario他有
    $db=db_connect(),在全局范围内分配该变量。错误消息表示该变量已设置为PDO对象,但您正在需要字符串的位置使用它,如
    echo$db。是什么导致了这个错误?你从info函数返回了什么。错误似乎是返回pdo$rowInfo对象,然后尝试将其编码为json字符串。将信息($rowId)拉到一个单独的行中,看看从中得到了什么。在
    db\u connect()
    函数中处理异常非常无用。如果连接失败,您仍然返回
    $db
    ,该值将为
    null
    。另外,错误消息的其余部分在哪里?哪个文件的哪一行导致了错误?@Tester您提到的
    //执行更多操作
    您必须确保返回$rowInfo->fetch(),而不返回任何其他内容。在代码中,您正在将pdo对象转换为字符串,例如strval($rowInfo)您将得到可捕获的致命错误:类PDOStatement的对象无法转换为字符串错误。但为什么我能够通过将$db作为参数传递到函数中来解决此问题?此外,我在传递$u POST var时从未遇到过任何问题。它已经是一个字符串,或者至少它被接受为一个字符串。