php-関数内で未定義の変数
プロジェクトに取り組んでいますが、$ 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";
答え :
解決策:
変数をパラメーターとして関数に渡す必要があります。関数の外部で宣言された変数は、その関数の内部では使用できません:
function dbConnect($user, $pass, $host, $dbname) {
try {
global $dbcon;
$dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
# ...
PHPの変数スコープの詳細をご覧ください。
答え :
解決策:
接続文字列情報を格納するために配列を使用することをお勧めします。
まず、 config.php
ページで、必要なDB接続文字列情報を返す関数を作成します。使用するには、 $dbconfig
から返された値を格納する$dbconfig
のupload.php
内で変数を宣言するだけです。 -4}はconfig.php
ファイルで機能します。次に、 $dbcon
変数を宣言し、値を dbConnect()に設定して、
。これにより、関数の結果が変数に返され、目的の結果を確認できます。 dbConnect()
関数を実行します。
このソリューションは、グローバル変数の必要性を排除し、組織を改善します。
注:移植性を向上させるには、DBインタラクション全体を技術的にクラスに移動する必要があります。
upload.php :
..。
関数{-コード-6}{
$dbconfig = loadDBConfig();
試す {
$ dburl = "mysql:host="。 $dbconfig['host']。 ";dbname="。 $dbconfig ['dbname'];
新しいPDO($ dburl、$dbconfig ['user']、$dbconfig ['pass']);を返します。
} catch(PDOException $ e){
echo $ e-> getMessage();
}
}
$dbcon = dbConnect();
..。
config.php :
<?php
関数{-コード-4}{
$ host = "localhost"; //MySQLホスト名
$ user = "root"; //MySQLユーザー
$ pass = "mypass"; //MySQLパスワード
$ dbname="ファイル";
return array('host' => $ host、'user' => $ user、'pass' => $ pass、'dbname' => $ dbname);
}
?>
答え :
解決策:
これらの変数をdbConnect内でもグローバルに宣言する必要があります。
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();
}
}
編集
はい、グローバルはあまり良い考えではありません。グローバルはコードの再利用を妨げ、名前空間を「汚染」します。どの変数が存在し、どの変数が存在しないかはわかりません。また、他の場所で使用された変数を変更するリスクがあります。< / p>
問題に取り組むためのより良い方法は、必要な情報を「パラメータ」として渡すことです。同じことが戻り値にも当てはまります。戻り値は、リソース(すべてがうまくいった場合)またはエラーメッセージを表す文字列である可能性があります。
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」と空のパスワードを使用します。 。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。