0

データベースから値を取得する関数が 2 つあります。関数内の接続 ( $connection) にアクセスすると、DB にアクセスできません。私はmysql + PHPを使用しています

コードは次のとおりです。

<?php
function getTierOne()
{
    require_once('../config.php');
    $provincequery="SELECT provinces.ProvinceID, provinces.ProvinceName FROM provinces WHERE ProvinceID > 0";
      $result = $connection->query($provincequery);
      while($province = $result->fetch_assoc()) 
        {
           echo '<option value="'.$province['ProvinceID'].'">'.$province['ProvinceName'].'</option>';
        }

}

//**************************************
//     First selection results     //
//**************************************
if(isset($_GET['func'])  &&  $_GET['func'] == "province") 
{
   province($_GET['drop_var']); 
}

function province($drop_var)
{  
    require_once('../config.php');

    $district_query = "SELECT  districts.DistrictID, districts.DistrictName, provinces.ProvinceName FROM districts, provinces WHERE                        provinces.ProvinceID=districts.ProvinceID AND districts.DistrictID > 0 AND provinces.ProvinceID='$drop_var'";

    $district_query_run= $connection->query($district_query);
    echo '<select name="district" id="district" style="width:150px;">
          <option value="0" disabled="disabled" selected="selected">Select Your District</option>';

           while($district= $district_query_run->fetch_assoc()) 
            {
              echo '<option value="'.$district['DistrictID'].'">'.$district['DistrictName'].'</option>';
            }

    echo '</select>';
    echo "<script type=\"text/javascript\">
$('#wait_2').hide();
    $('#district').change(function(){
      $('#wait_2').show();
      $('#result_2').hide();
      $.get(\"ProDisPds/func.php\", {
        func: \"district\",
        drop_var: $('#district').val()
      }, function(response){
        $('#result_2').fadeOut();
        setTimeout(\"finishAjax_tier_three('result_2', '\"+escape(response)+\"')\", 400);
      });
        return false;
    });
</script>";
}
?>
4

1 に答える 1

1

これらの関数の内部を必要としないことを検討してください。データベース接続への参照であるこれらの関数に引数を渡す方が理にかなっています。

そうする

require_once('../config.php');

関数を使用する関数を呼び出す前に、一度だけ実行できる場合に多くの時間を必要とする場合は、より実用的でオーバーヘッドが少なくなります。

接続のソースであるため、config.php を表示する必要がありますが、

$connection

config.php の内部で定義されています。isset

if($isset($connection))

それにもかかわらず、それが設定されているかどうかはわかりません。設定されていない場合は、config 内で作成したと思われるデータベース接続機能にアクセスして、新しい接続を作成できます。

ここでは、三項演算子が役立つ場合があります。

$connection = if(isset($connection)) ? $connection : newConnection();

これが機能せず、これが学校のプロジェクトなどである場合は、ファイル内でアクセスできるグローバル変数として接続を定義してみてください。config.php 内でこのようなことを行うことができます。

$GLOBALS['connection'] = connect(); // Or $connection or whatever the function name was.

だからあなたはこのようなことをすることができます

require_once('../config.php');
$connection = $GLOBALS['connection'];

接続が必要なファイルの内部。

しかし、グローバル変数の使用は危険であり、他のすべてを試した場合以外は使用しないでください。

構成ファイルと関連するコード全体を見せていただければ、さらに役立つヒントを提供できれば幸いです。

さらに 2 つ: あなたのコードはSQL インジェクションに対して脆弱であり、プリペアド ステートメントを使用し、JavaScript と PHP を混在させないでください。

于 2013-05-05T04:16:30.323 に答える