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

콘솔을 호출 [14 8 월 2011 15시 59분 59초] PHP 공지 : 정의되지 않은 상수 루트의 사용 - 에서 '루트'를 가정/응용 프로그램/데이터베이스에 대한 MAMP/htdocs3/nettuts/PHP/PDO 20 행의/mysql_pdo_connect.php에 액세스하십시오. "은 OS X의 반환 "에

나는 "googled"했고 여기에서 부분적인 대답을 발견했습니다. 그래서 저는 여기에서 완성을 희망했습니다.

TIA는

+1

또한 상수를 보간하는'$의 PHP = "반드시 htmlspecialchars"'해결 방법을 사용해서는 안된다. 가능하다. 그러나 이것이 유용한 특별한 경우는 아니다. 오히려 PDO DSN 초기화 문자열을 분리하고 상수를 정상적으로 연결합니다.'= new PDO ("mysql : host =". DB_HOST. "dbname =". DB_NAME. ";")' – mario

답변

17

당신은 할 수 :

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

: 따옴표와 함께

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

. 그렇지 않으면 PHP는 문자열 대신에 상수라고 생각합니다. 그러나 코드를보고 난 당신이 간단하지 말라 왜 그렇게 데이터베이스에 액세스 할 constants를 정의한 참조 :

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

UPDATE 당신은 PDO와 MySQL을 사용하는 것을 나는 또한 볼

. safely use MySQL with PDO하기 위해 당신이 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); 

가 나는 또한 (UTF8로 내 경우) DSN 문자열의 인코딩을 설정 한 점에 유의하시기 바랍니다. 또한 코드에서 상수가 필요한지 궁금합니다. 요청 당 하나의 연결 만 필요하므로 (동일한 데이터베이스로) 연결을 한 번 작성한 후 전달하면 해당 전역을 둘 필요가 없습니다. 필요로하는 코드 부분에 대한 연결. 이에 대한 자세한 내용은 내 다소 related question을 참조하십시오.

0

당신은 당신은 위의 코드에서 어디 root라는 상수를 정의하지 않은

4

단일 따옴표에 'root'문자열을 넣어해야합니다. 대신 DB_USER이라는 값이 인 상수를 "루트"로 정의하고 다른 하나는 DB_PASSWORD을 동일한 값으로 정의했습니다. 이 상수의 작동 방식에 대한 자세한 내용은 the PHP documentation page for define()을 참조하십시오.

이 시도 :

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

이러한 인용 부호의 배열은 필요합니다. 내가 가진 새로운 PDO ("mysql : host = DB_SERVER ...")가 나에게 오류를 일으켰다. – Mark