Istnieje mały problem pdo, nad którym pracuję od dłuższego czasu. Ponieważ nie wiem, co tu jest nie tak, pomyślałem o zabraniu go na tę listę. Może niektórzy z was wiedzą więcej ...php/pdo/msql - odmowa dostępu
Mam stronę internetową z loginem, który sprawdza użytkownika i hasło do bazy danych obsługiwanej przez mysql. Gdy połączenie pdo jest wykonane w tym samym pliku, wszystko działa poprawnie, można się zalogować, bez żadnych problemów. Podobnie jak to ma działać ...
Jednak podczas przesuwania części połączenia bazy danych do funkcji indywidualne, które obejmują od innego pliku, pdo nie działa na mnie i daje mi:
SQLSTATE[28000] [1045] Access denied for user '...'@'...' (using password: NO) Fatal error: Call to a member function prepare() on a non-object in /.../.../... on line 41
dla jasności, oto kod:
Wersja 1:
to działa:
<?php
require "./vars_and_functions.php";
/* open database connection */
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();
if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;
/* and redirect */
header("...");
} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;
/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>
Oto wersja 2
To nie działa:
<?php
require "./vars_and_functions.php";
/* open database connection */
$pdo = database_connection();
/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();
if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;
/* and redirect */
header("...");
} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;
/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>
Moja includefile vars_and_functions.php wygląda następująco:
$db_host = "...";
$db_name = "...";
$db_user = "...";
$db_pass = "...";
function database_connection() {
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}
catch(PDOException $e) {
echo $e->getMessage();
}
return $pdo;
}
Jedyną różnicą jest moim zdaniem tutaj połączenie pdo jest wykonywane przez wywołanie funkcji, podczas gdy funkcja znajduje się w pliku włączającym vars_and_functions.php.
Co jest nie tak?
Włącz 'error_reporting', który powie ci, że zmienne nie są dostępne w zasięgu funkcji zmiennej lokalnej. – mario
W porządku, zdaję sobie sprawę, że prezentacja kodu wygląda tu trochę niechlujnie. Pracuję nad poprawieniem ... – user1803765