2011-08-14 9 views
8
<?php # Nettuts Tutorial using PHP Data Objects (PDO), 

/**This file contains the database access information 
*This file also establishes a connection to mySQL 
*and selects the database. 
*Set the database access information as constants: 
**/ 
// print_r(PDO::getAvailableDrivers()); 

DEFINE('DB_USER', 'root'); 
DEFINE('DB_PASSWORD', 'root'); 
DEFINE('DB_HOST', 'localhost'); 
DEFINE('DB_NAME', 'sitename'); 

$php = "htmlspecialchars"; 
try { 
    #MySQL with PDO_MYSQL 
    // $DBH = new PDO("mysql:host={$php(DB_HOST)}; dbname={$php(DB_NAME)}", root, root}; 
    $DBH = new PDO("mysql:host=localhost; dbname= sitename", root, root); 

    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    # UH-OH! Typed DELECT instead of SELECT! 
    $DBH->prepare('DELECT name FROM people'); 
} catch (PDOException $e) { 
    echo "I'm sorry, Dave. I'm afraid I can't do that."; 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 
?> 

konsoli w OS X zwrotów „[14-sie-2011 15:59:59] PHP Wskazówka: Użyj o niezdefiniowanej stałej korzenia - Zakłada 'root' w /Aplikacje/MAMP/htdocs3/nettuts/PHP/PDO dla bazy danych Access/mysql_pdo_connect.php na linii 20. "Używanie stałych w PHP PDO wzywa

Mam "googled" i znalazłem częściową odpowiedź tutaj. Tak więc liczyłem na zakończenie tutaj.

TIA

+1

Należy również nie używać '$ = "php"' htmlspecialchars obejście interpolować stałe. Jest to możliwe, ale nie jest to jeden ze szczególnych przypadków, w których jest to użyteczne. Raczej rozpadnij ci początkowy ciąg znaków PDN DSN i spójź stałe: '= nowy PDO (" mysql: host = ". DB_HOST." Dbname = ". DB_NAME."; ")' – mario

Odpowiedz

17

zrobić:

$DBH = new PDO("mysql:host=localhost; dbname= sitename", root, root); 

która powinna być:

$DBH = new PDO("mysql:host=localhost; dbname= sitename", 'root', 'root'); 

cytatami. W przeciwnym razie PHP uważa, że ​​jest to ciągła zamiast łańcucha. Jednak patrząc na kodzie widzę zdefiniowaniu constants dostępu do bazy danych, więc dlaczego nie po prostu zrobić:

$DBH = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME, DB_USER, DB_PASSWORD); 

UPDATE

widzę też, że używasz MySQL z PDO. Należy pamiętać, że w celu safely use MySQL with PDO trzeba disable emulated prepared statements:

$DBH = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD); 
$DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

Należy pamiętać, że również ustawić kodowanie w ciągu DSN (w moim przypadku na utf8). Zastanawiam się również, czy naprawdę potrzebujesz stałych w kodzie, ponieważ często będziesz potrzebować tylko jednego połączenia na żądanie (do tej samej bazy danych), więc nie będziesz musiał zmieniać globów, jeśli po prostu utworzysz połączenie raz i przejdziesz połączenie z częściami kodu, które tego potrzebują. Zobacz także mój nieco related question, aby uzyskać więcej informacji na ten temat.

0

Trzeba umieścić 'root'ciąg w pojedynczych cudzysłowach

4

nie zdefiniowano stałą o nazwie root nigdzie w powyższym kodzie. Zamiast tego zdefiniowano stałą o nazwie DB_USER o wartości o wartości "root" i inną o nazwie DB_PASSWORD o tej samej wartości. Spójrz na the PHP documentation page for define(), aby uzyskać więcej informacji na temat działania tego typu stałej.

Spróbuj tego:

$DBH = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, 
       DB_USER, 
       DB_PASSWORD 
      ); 
+0

Układ tych cytatów jest właśnie tym, potrzebne. Miałem ... nowy PDO ("mysql: host = DB_SERVER ..."), który powodował błąd. – Mark