Соединение не определено - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующий код

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

Но у меня возникает проблема при его использовании

(!) Примечание: неопределенная переменная: dbh в C: \ wamp64\ www \ HawkI \ bdd.php в строке 66

Я не понимаю правильно, как работает PHP, я впервые использую его, но я попытался сделать

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

Это тоже не работает.

Кроме того, кажется, что значения, которые помещаются вне функций, не являются глобальными, как это было бы в js, как я могу сделать что-то доступным из любого места (например, файл, содержащий этот файл?))

Спасибо

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Чтобы использовать $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);
}
0 голосов
/ 04 июня 2018

Вы можете использовать как это

$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);
} 
0 голосов
/ 04 июня 2018

Лучше было бы сделать что-то вроде этого:

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