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

Console trong OS X trở lại "[14-Aug-2011 15:59:59] PHP Chú ý: Sử dụng của rễ liên tục không xác định - giả 'root' trong /Ứng dụng/MAMP/htdocs3/nettuts/PHP/PDO cho Cơ sở dữ liệu Truy cập/mysql_pdo_connect.php trên dòng 20. "Sử dụng hằng PHP PDO gọi

Tôi đã "googled" và tìm thấy câu trả lời một phần ở đây. Vì vậy, tôi đã hy vọng hoàn thành ở đây.

TIA

+1

Bạn cũng không nên sử dụng '$ php = "htmlspecialchars"' workaround để suy hằng số. Đó là có thể, nhưng không phải là một trong những trường hợp đặc biệt mà điều này là hữu ích. Thay vì phá vỡ bạn PDO DSN init chuỗi và concat hằng số bình thường: '= new PDO (" mysql: host = ". DB_HOST." Dbname = ". DB_NAME."; ")' – mario

Trả lời

17

Bạn làm:

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

nào cần phải có được:

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

Với dấu ngoặc kép. Nếu không PHP nghĩ rằng đó là một số hằng số thay vì một chuỗi. Tuy nhiên bằng cách nhìn vào mã của bạn tôi thấy bạn đã xác định constants để truy cập cơ sở dữ liệu nên tại sao bạn không chỉ cần làm:

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

CẬP NHẬT

Tôi cũng thấy rằng bạn đang sử dụng MySQL với PDO. Xin lưu ý rằng để safely use MySQL with PDO bạn phải 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); 

Xin lưu ý rằng tôi cũng đã thiết lập mã hóa trong chuỗi DSN (trong trường hợp của tôi để utf8). Tôi cũng tự hỏi nếu bạn thực sự cần hằng số trong mã của bạn, vì thường bạn sẽ chỉ cần một kết nối cho mỗi yêu cầu (đến cùng một cơ sở dữ liệu), do đó bạn không cần phải có các hình cầu đó trôi nổi xung quanh nếu bạn chỉ tạo kết nối một lần và vượt qua kết nối với các phần của mã cần nó. Xem thêm phần của tôi related question để biết thêm thông tin về điều này.

0

Bạn cần phải đặt 'root'bạn chuỗi trong một dấu nháy đơn

4

Bạn chưa xác định một hằng số gọi root bất cứ nơi nào trong đoạn code trên. Thay vào đó, bạn đã xác định một hằng số được gọi là DB_USER với giá trị của "gốc" và một số khác được gọi là DB_PASSWORD có cùng giá trị. Hãy xem the PHP documentation page for define() để biết thêm thông tin về cách hoạt động của loại hằng số này.

Hãy thử điều này:

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

Việc sắp xếp các báo giá chỉ là những gì tôi cần thiết. Tôi đã có ... PDO mới ("mysql: host = DB_SERVER ..."), đã gây ra lỗi cho tôi. – Mark

Các vấn đề liên quan