0

プロジェクトに取り組んでいますが、$ host、$ dbname、$ user、および$passに対して未定義のエラーが発生しています。

ただし、エラーは、それらがdbConnect()関数内にある場合にのみ発生します。

コード(upload.php)は次のとおりです。

<?php
error_reporting(E_ALL);
require('config.php');

$filename = htmlentities($_FILES['file']['name']);
$tmpname = $_FILES['file']['tmp_name'];
$filesize = $_FILES['file']['size'];
$filetype = $_FILES['file']['type'];    

function dbConnect() {

    try {
        global $dbcon;
        $dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    }
    catch (PDOException $e) {
        echo $e->getMessage();
    }
}

if (dbConnect()) {
    print('worked');
}

config.php:

<?php
global $host, $user, $pass, $dbname;

$host =  "localhost"; // MySQL Hostname
$user = "root"; // MySQL User
$pass = "mypass"; // MySQL Password
$dbname = "files";
4

3 に答える 3

1

変数をパラメーターとして関数に渡す必要があります。関数の外で宣言された変数は、その関数内では使用できません。

function dbConnect($user, $pass, $host, $dbname) {

    try {
        global $dbcon;
        $dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    }
# ...

PHP の変数スコープの詳細を参照してください。

于 2012-07-18T18:43:04.543 に答える
0

これらの変数をdbConnect内でもGLOBALと宣言する必要があります。

function dbConnect() {
  try {
        global $dbcon;
        global $host, $user, $pass, $dbname;
        $dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
  }
  catch (PDOException $e) {
        echo $e->getMessage();
  }
}

編集

はい、グローバルは本当に良い考えではありません。グローバルはコードの再利用を妨げ、名前空間を「汚染」します。どの変数が存在し、どの変数が存在しないかはわかりません。また、別の場所で使用された変数を変更するリスクがあります。

問題に取り組むためのより良い方法は、必要な情報を「パラメータ」として渡すことです。同じことが戻り値にも当てはまります。戻り値は、リソース(すべてがうまくいった場合)またはエラーメッセージを表す文字列である可能性があります。

function dbConnect($host, $dbname, $user = 'nobody', $pass = '') {
  try {
        return new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
  }
  catch (PDOException $e) {
        return $e->getMessage();
  }
}

このような関数を呼び出して、パラメーターを渡し、その出力を確認します。すべてがうまくいけば、オブジェクトであることが期待されます。

if (!is_object($conn = dbConnect($host, $dbname, $user, $pass) {
   die("There was an error: $conn");
}

パラメータのもう1つの利点は、パラメータのデフォルト値を設定できることです(たとえば、dbConnect($ host、$ dbname)を記述した場合、関数は「理解」し、残りのパラメータに「nobody」と空のパスワードを使用します)。

于 2012-07-18T18:39:51.063 に答える
0

配列を使用して接続文字列情報を保存することをお勧めします。

まず、config.php必要な DB 接続文字列情報を返す関数をページに作成します。使用するには、関数から返された値をファイルに格納する変数upload.phpを宣言するだけです。次に、変数を宣言し、値を に設定して関数を実行します。これにより、関数の結果が変数に返され、目的の結果を確認できます。$dbconfigloadDBConfig()config.phpdbConnect()$dbcondbConnect()

このソリューションにより、グローバル変数が不要になり、組織が改善されます。

注: 移植性を向上させるために、DB との対話全体を技術的にクラスに移動する必要があります。

アップロード.php :

...
function dbConnect() {
    $dbconfig = loadDBConfig();
    try {
        $dburl = "mysql:host=" . $dbconfig['host'] . ";dbname=" . $dbconfig['dbname'];
        return new PDO($dburl, $dbconfig['user'], $dbconfig['pass']); 
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
 }  

$dbcon = dbConnect();
...

config.php :

<?php 
function loadDBConfig(){
    $host =  "localhost"; // MySQL Hostname 
    $user = "root"; // MySQL User 
    $pass = "mypass"; // MySQL Password 
    $dbname = "files"; 

    return array('host' => $host, 'user' => $user,  'pass' => $pass, 'dbname' => $dbname);
}
?> 
于 2012-07-18T19:25:54.763 に答える