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

Konsolu çağırır [14-Ağustos-2011 15:59:59] PHP Uyarı: tanımsız sabit kökü kullanımı - yılında 'kök' varsayılır/Uygulamalar/MAMP/htdocs3/nettuts/PHP/PDO Veritabanı için Erişim/mysql_pdo_connect.php on line 20 "OS X getiri "in

Ben "googled" ettik ve burada kısmi bir yanıt buldu. Bu yüzden burada bitirmeyi umuyordum.

TIA

+1

Ayrıca sabitleri interpolasyon yapmak '$ php = "htmlspecialchars"' geçici çözümü kullanmamalısınız. Bu mümkün, ancak bunun yararlı olduğu özel durumlardan biri değil. Bunun yerine, PDO DSN init dizesini kırın ve sabitleri normal olarak yerine getirin: '= yeni PDO (" mysql: host = ". DB_HOST." Dbname = ". DB_NAME."; ")' – mario

cevap

17

Sen yapın:

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

: tırnak ile

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

. Aksi halde PHP bir dizgenin yerine sabit olduğunu düşünüyor. Ancak Kodunuzdaki bakarak ben sadece yapmıyorsunuz neden bu kadar veritabanına erişim constants tanımladık bkz:

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

GÜNCELLEME PDO ile MySQL kullandığınızı olduğunu da görebiliyordum

. safely use MySQL with PDO amacıyla size disable emulated prepared statements gerektiğini unutmayın:

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

Ben de (utf8 benim durumumda) DSN dizesinde kodlamasını belirledik unutmayınız. Ayrıca, kodunuzdaki sabitlere gerçekten ihtiyacınız olup olmadığını merak ediyorum, çünkü sık sık her istek için (aynı veritabanına) yalnızca bir bağlantıya ihtiyacınız olacaktır. Kodun ihtiyaç duyduğu bölümlerine bağlantı. Bununla ilgili daha fazla bilgi için benim de related question'a bakın.

0

Sen yukarıdaki kodda yerde root adında bir sabit tanımlamadınız

4

tek tırnak içinde 'root'dize koymak gerekir. Bunun yerine, DB_USER adı verilen ve "root" değerine sahip bir sabiti ve aynı değerle DB_PASSWORD adı verilen bir sabiti tanımladınız. Bu tür sabit çalışmalarla ilgili daha fazla bilgi için the PHP documentation page for define()'a bakın.

bu deneyin:

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

Bu alıntıların düzenlemesi tam olarak gerekli. Benim için bir hataya neden olan yeni PDO ("mysql: host = DB_SERVER ...") vardı. – Mark