【问题标题】:Connection is not defined未定义连接
【发布时间】:2018-11-13 11:28:50
【问题描述】:

我有以下代码

    <?php
$host = "localhost";
$dbname = "hawkI";
$user = "root";
$password = "";

$userExist = false;
$userIP = null;
$userHasFinish = null;
$userLastPage = null;

try {
    $dbh = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

function getIPforBDD(){
    return $_SERVER['REMOTE_ADDR'];
}

function UpdateUserProfile()
{
    $requete = "SELECT * FROM users WHERE ip = ".getIPforBDD();
    $result = $dbh->query($requete);

    if($resultat->rowCount() == 0)
        exit();

    foreach($result as $ligne)
    {       
        $userIP = $ligne['ip'];
        $userhasFinish = $ligne['finish'];
        $userLastPage = $ligne['lastPage'];
    }
}

function CheckUserPosition()
{
    UpdateUserProfile();
    if(!$userExist)
        AddUser();

    return GetUserStatus();
}

function GetUserStatus()
{
    $page;
    if($userHasFinish)
        $page = "end.php";
    else
        $page = $userLastPage;

    return $page;
}

function AddUser()
{
    $requete = "INSERT INTO users (ip, finish, lastPage) VALUES (".getIPforBDD().", ".false.", questionnaire_initial.php)";
    $result = $dbh->query($requete);
}

function SavePageInBDD($page){
    $requete = "UPDATE users SET lastPage = '.$page.' WHERE ip = ".getIPforBDD();
    $result = $dbh->query($requete);
} 
?>

但是,我用的时候有问题

( ! ) 注意:未定义变量:C:\wamp64\www\HawkI\bdd.php 中的 dbh 在第 66 行

我第一次使用 PHP 时并没有正确理解它是如何工作的,但我尝试了

global $dbh = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $password);

那也行不通。

此外,似乎放在函数之外的值不像在 js 中那样是全局的,我怎样才能让某些东西可以从任何地方访问(比如包含该文件的文件)

谢谢

【问题讨论】:

  • 将其构建为一个类,并在构造函数中添加凭据,设置属性等,或者只是在参数中注入连接对象

标签: php pdo phpmyadmin


【解决方案1】:

你可以这样使用

$host = "localhost";
$dbname = "hawkI";
$user = "root";
$password = "";
$userExist = false;
$userIP = null;
$userHasFinish = null;
$userLastPage = null;
$dbh = NULL;
function db () {
    try {   
        if ($GLOBALS['dbh']===NULL){ 
            $GLOBALS['dbh'] = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $password);
        }
        return $GLOBALS['dbh'];    
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
}

function SavePageInBDD($page){
    $dbh = db();       
    $requete = "UPDATE users SET lastPage = '.$page.' WHERE ip = ".getIPforBDD();
    $result = $dbh->query($requete);
} 

【讨论】:

    【解决方案2】:

    要在函数中使用$dbh,您需要在函数范围内包含global关键字。

    你可以在这里找到全局关键字解释http://php.net/manual/en/language.variables.scope.php#language.variables.scope.global

    function AddUser()
    {
        global $dbh;
        $requete = "INSERT INTO users (ip, finish, lastPage) VALUES (".getIPforBDD().", ".false.", questionnaire_initial.php)";
        $result = $dbh->query($requete);
    }
    

    【讨论】:

      【解决方案3】:

      更好的方法是这样做:

      function getDB(){
        $dbh = null;
        try {
          $dbh = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $password);
         } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
         }
         return $dbh;
      }
      

      比在你的函数中这样做:

      function AddUser()
      {
          $dbh = getDB();
          if(!is_null($dbh)){
               $requete = "INSERT INTO users (ip, finish, lastPage) VALUES (".getIPforBDD().", ".false.", questionnaire_initial.php)";
               $result = $dbh->query($requete);
          }
      }
      

      【讨论】:

      • 这个解决方案没问题,但是当你尝试 go getDB 时它会创建一个新的连接。为什么不在函数范围内使用 $bdh 的全局关键字?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多