3

PDO 接続での定数の使用、および PDO 接続を含む関数の呼び出しに問題があります。

必要な場合にのみDBに接続する機能を使用しています。DB 作業が不要なページでは、接続する必要はありません。

私はたくさん試しましたが、どこが間違っているのかわかりません。

<?php
/** The name of the database */
define('DB_NAME', 'dev-db');

/** MySQL database username */
define('DB_USER', 'root');

/** MySQL database password */
define('DB_PASSWORD', 'dxdb');

/** MySQL hostname */
define('DB_HOST', 'localhost');

function connect(){
try
    {**//Here's where the first problem is**
        $conn = new PDO('mysql:host=DB_HOST;dbname=DB_NAME',DB_USER,DB_PASSWORD);
        $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }catch(PDOException $e) 
    {
        echo 'ERROR: ' . $e->getMessage();
    }
}

connect();// Here's where it fails again

$sql = 'insert into names (names) values (:what)';
$what = "testValue";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':what', $what, PDO::PARAM_STR, 5);
$stmt->execute();
4

2 に答える 2

2

実際のところ、この質問は PDO とは何の関係もありませんが、PHPの文字列とは関係ありません。

では、問題は「文字列で定数を使用する方法」です。

答えはかなり単純です - それらを文字列で連結します。

また、接続方法が間違っています。適切な方法については、タグ wikiを参照してください。

2 番目の問題は PDO とは何の関係もありません。変数のスコープの問題です。$conn関数が変数を返すようにしてから呼び出すだけです

$conn = connect();

また、PDO を使用する場合、ホストとデータベースに個別の定数を定義しても意味がありません。DSN は別のエンティティであり、他のドライバーの HOST と同様です。

したがって、コードは次のようになります (ただし、dev-db が有効なデータベース名であるかどうかはわかりません)。

define('DB_DSN', 'mysql:host=localhost;dbname=dev-db;charset=utf8');
define('DB_USER', 'root');
define('DB_PASSWORD', 'dxdb');

function connect() 
{
    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    return new PDO(DB_DSN,DB_USER,DB_PASSWORD, $opt);
}
$conn = connect();
于 2013-04-23T08:59:51.560 に答える