9

mysql_*からmysqliオブジェクト指向への受け渡しに少し問題があります。

私のindex.phpファイルは、次の2つのファイルを含むように構成されています。

include('connect.php');
include('function.php');

connect.phpファイルには次のものが含まれています。

<?php
$mysqli = new mysqli("localhost", "root", "test", "test");

if (mysqli_connect_errno($mysqli)) {
    printf("Connection failed: %s\n", mysqli_connect_error());
    exit();
}
?>

function.phpファイルには、引数をとらないが$mysqli接続を使用するshowPageという関数が次のような行にあります

$result = $mysqli -> query("SELECT * FROM $table ORDER BY ID DESC"); // Seleziono tutto il contenuto della tabella

$ mysqli変数を関数に渡さずに動作するように管理することはできませんが、mysql_*非推奨の関数を使用した場合はこれは必要ありませんでした。

理由を理解できますか?これを解決するための最良の方法は何ですか?

4

3 に答える 3

10

PHPでは、ユーザー定義関数には独自の変数スコープがあります。関数にパラメーターとして渡す$mysqliか、関数をで開始する必要がありますglobal $mysqli

この正確な問題は、変数スコープページの例として示されています。

ただし、ユーザー定義関数内にローカル関数スコープが導入されています。関数内で使用される変数は、デフォルトでローカル関数スコープに制限されています。たとえば、echoステートメントは$ a変数のローカルバージョンを参照しており、このスコープ内の値が割り当てられていないため、このスクリプトは出力を生成しません。これは、ローカル定義によって特にオーバーライドされない限り、Cのグローバル変数が関数で自動的に使用可能であるという点で、C言語とは少し異なることに気付くかもしれません。これにより、人々が誤ってグローバル変数を変更する可能性があるという問題が発生する可能性があります。PHPでは、グローバル変数を関数で使用する場合は、関数内でグローバル変数を宣言する必要があります。

<?php
$a = 1; /* global scope */ 

function test()
{ 
    echo $a; /* reference to local scope variable */ 
} 

test();
?>
于 2012-12-24T02:57:26.353 に答える
0

$ mysqli変数を関数に渡さずに動作するように管理することはできませんが、mysql_*非推奨の関数を使用した場合はこれは必要ありませんでした。

それは本当に正しくありません。古い関数でも、関連するデータベース接続をmysql_*指定する必要がある場合は、実際にはリンク識別子を渡す必要がありました。例:

$result = mysql_query($sql, $link);

また、この例が示すように、あなたも通過しなければなりませ$resultんでした。パラメータを省略した場合$link

$result = mysql_query($sql);

mysql拡張機能は、最後に使用された接続を内部的に検索しました。何も見つからなかった場合は、php.iniで設定されたパラメータを使用して新しいものが作成されます。これは、これが過去になぜ、どのように機能したのかをよりよく理解するための情報です。

于 2012-12-24T03:03:05.913 に答える
-1

接続プールを使用することもできます。これを確認する価値があります。

$mysqli = new mysqli('p:localhost', 'username', 'password', 'db_name');
于 2014-09-02T06:44:18.670 に答える