8

PHP でvishwasthali.orgという名前の Web サイトを開発し、サードパーティ サーバーのIIS7でホストしています。MySQLi APIを使用して記述したデータベース アクセスのコードを除いて、他のすべては問題なく動作します。コードはローカルホストでは正常に機能しますが、サーバーでは機能しません。phpinfo()サーバーと私のマシンで使用すると、次のことがわかりました。

(1) 私のマシン (Windows 7 32 ビット、Apache ホスティング環境で実行) では、PHP のバージョンは5.3.8で、mysqli のバージョンは5.0.8-devです。

(2) サーバー (Windows Server 2008、IIS7 ホスティング環境で実行) では、PHP バージョンは5.2.14で、mysqli バージョンは5.0.51aです。


phpinfo()サーバー上 のスクリーンショットは次のとおりです。ここに画像の説明を入力 ここに画像の説明を入力


mysqliコードのサンプルを次に示します。

session_start();
include_once 'code_files/conn.php';
$stmt = $mysqli->prepare('SELECT * FROM adminusers WHERE Username = ? AND `Password` = ?');
$stmt->bind_param('ss', $_POST['Username'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows > 0)
    ........
else
    ........

使用するとmysqliecho get_class($mysqli);が表示されます。つまり、コードは mysqli を検出します。しかし、声明は準備されていません。エラーが表示されない場合でも、IIS で PHP が実行されていることが原因である可能性があります。$stmt$mysqli->error;

データベース アクセスのコードを従来のmysql API に変更するか、 php.netから最新の PHP バイナリをダウンロードしてサーバー上の PHP および MySQLi バージョンをアップグレードするかの 2 つのオプションがあります。最初のオプション (これは確実に機能します) は使いたくありません。その理由を教えていただければ幸いです。後者は私の手にありません。これら以上のものは考えられません。

php_mysqli.dll を置き換えると、mysqli バージョンがアップグレードされる可能性があると思いますが、わかりません。しかし、PHP のバージョンはどうでしょうか。

この場合、どうすればよいでしょうか。サーバー上の PHP と MySQLi のバージョンをアップグレードすると、問題は解決しますか? はいの場合、サーバー上で実行されている他の PHP Web サイトに影響を与えますか?

前もって感謝します。

4

2 に答える 2

7

わかった。これが解決策です。IIS7 では、さまざまな PHP バージョンを有効にして、並行して実行できます。私のマシンでテストに成功した手順は次のとおりです。IIS と FastCGI に精通していることを考慮して、プロセスの簡単な説明のみを行います。そうでない場合は、次のリンクを参照してください: http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis'

  1. http://www.php.net/downloads.phpから、PHP のバイナリを含むスレッドセーフでない zip パッケージの異なるバージョンをダウンロードします。
  2. C:\PHP5.2.14C:\PHP5.4.3などのように、ハードドライブの個別のフォルダーにそれらを抽出します。
  3. すべてのフォルダーでphp.iniファイルを開き、すべてのフォルダーで次の設定を追加/コメント解除して変更します。

    session.save_path = "C:\Windows\Temp"
    Exposure_php = オフ
    ;; ここで任意のパスを選択しますが、ほとんどの場合はこの
    open_basedir = "C:\inetpub\wwwroot"
    extension_dir = "ext"
    fastcgi.impersonate = 1
    cgi.fix_pathinfo=1
    cgi.force_redirect = 0
    ;;をお勧めします。異なる Web サイトに対して異なるタイム ゾーンを選択できます
    date.timezone = "you time zone"
    ;; ウェブサイトごとに必要な拡張機能を有効にします。例:
    extension=php_mysql.dll
    extension=php_mysqli.dll

  4. IIS マネージャーを開きます。インストールする PHP バージョンの数と同じ数のハンドラー マッピングを追加します。[モジュール マッピングの編集] ダイアログ ボックスで実行可能ファイルのパスを変更するだけです。PHP 5.2.14 via FastCGIPHP 5.4.3 via FastCGIのように、簡単に識別できるようにマッピングに名前を付けます。

  5. IIS マネージャーの IIS セクションで、FastCGI Settingsを開きます。ここで、実行したい PHP バージョンの数だけエントリがあるかどうかを確認します。そうでない場合は、右側のペインから[アプリケーションの追加] をクリックします。[ FastCGI アプリケーションの追加] ダイアログ ボックスの [フル パス] フィールドで、必要な PHP バージョンのフォルダーからphp-cgi.exeを選択します。[OK] をクリックします。

  6. ここで、Web サイト フォルダーをC:\inetpub\wwwrootまたは php.ini のopen_basedir設定で選択した任意のパスにコピーします。IIS マネージャーで、左側のペインから [サイト] -> [既定の Web サイト] を展開します。特定のバージョンの PHP を対象とする Web サイトを選択します。

  7. ハンドラー マッピングを開き、左側のペインから Web サイトを選択します。ここには多くのマッピングがあります。自分で作成したエントリ (パスが*.phpのもの) だけを探します。それらの中で、選択した特定の Web サイトに必要なものだけを保持し、他のものを削除します。これにより、マシンからマッピングが削除されることはありませんが、選択した Web サイトからのみ削除されます。Web サイトは、保持したマッピングを持つ PHP バージョンでのみ実行されます。特定の PHP バージョンを対象とするすべての Web サイトに対して同じことを行います。Web サイトで実行してテストできphpinfo()ます。

新しい Web サイトをwwwrootに追加すると、ハンドラーがアタッチされなくなります。目的の PHP バージョンを対象とする新しいハンドラーを追加します。これで完了です。

これは最善の手順ではない可能性があります。しかし、それは私にとってはうまくいきました。検証については、次のリンクを参照してください:
http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis/#PHP_Versioning'

誰かがこれを必要とする場合に備えて、それが役立つことを願っています.

よろしく

于 2012-06-04T14:51:12.113 に答える
3

ここにはかなり間違っていることがいくつかあります!

a)開発環境とライブサイトの違いが大きすぎます!少なくとも同じWebサーバーと同じPHP5.xバージョンを使用してください。

b)phpinfo()を公にアクセス可能にしないでください。これは、非常に大きなセキュリティリスクです。ハッカーはそこからたくさんの素晴らしい情報を得ることができます。

c)プリペアドステートメントを使用する場合でも、クエリで使用する前にユーザーデータをサニタイズする必要があります。

私はあなたの問題が異なるmysqliバージョンとは何の関係もないと思います。おそらく、最初に両方の環境で同じWebサーバーとPHPバージョンを使用していることを確認してから、それでも機能しない場合は、さらにコード(接続方法など)を再度尋ねる必要があります。

はい、PHPを更新すると、サーバー上の他のプロジェクトに影響を与える可能性がありますが、それは、これらのプロジェクトを更新する必要があることを意味します。

いいえ、php.netからPHPをダウンロードするのはあなたの場合正しい方法ではありません。それぞれのリポジトリで提供されている、テスト済みで承認済みのバージョンを使用する必要があります。

于 2012-06-03T17:17:40.130 に答える