0

私の問題は、グローバルスコープでmysqlを使用すると機能するが、内部では機能しないということです。コードを見てください。

//connect.php
@mysql_connect($mysql_server, $mysql_admin, $mysql_pass);
@mysql_select_db($mysql_db);

//main.php
require_once("connect.php");
$rReq = $_REQUEST["req"];

function failed()
{
        $qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'");
        $ro = mysql_fetch_row($qe);
        $ro[0]+=1;
        mysql_query("UPDATE db SET success_count = '".$ro[0]."' WHERE serial='".$rReq."'");
}

//main code
failed(); // not works, mysql_query does nothing

//if i put here the same code but outside the function it works :/
$qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'");
$ro = mysql_fetch_row($qe);
$ro[0]+=1;
mysql_query("UPDATE db SET success_count = '".$ro[0]."' WHERE serial='".$rReq."'");
4

3 に答える 3

1

変数は$rReq関数スコープ内で定義されていないため、失敗します。可能であれば、それをパラメーターとして関数に渡す必要があります。

また、エラーを抑制しないことをお勧めします。これは悪い習慣と見なされており、エラーの報告があった場合は、「未定義の変数...」エラーが役に立ちます。

于 2012-12-25T16:58:41.190 に答える
1

クエリでエラーチェックを行っていないので、何が問題なのかを通知せずに失敗するのも不思議ではありません。それが最初に修正する必要があります。適切なエラーチェックを追加する方法については、マニュアルまたはこの質問を参照してください。また、は@接続時のエラーメッセージを抑制します-それらを削除すると、何がうまくいかないかについての情報が得られます。

あなたが言うように、あなたの具体的な問題はスコープに関係しています。たとえば、次のように、必要なすべての変数を関数に渡す必要があります。

function failed($rReq, $qe)
  { 
   ....
  }

また、コードはSQLインジェクションに対して脆弱であり、非常に危険であることに注意してください。

mySQL拡張機能は古く、新しいコードを書き始めるのは良い考えではありません。代わりにPDOに切り替えることを検討してください-新しいことを学ぶとき、それは追加の負担になることを私は知っていますが、それは本当に追加の努力の価値があります!

于 2012-12-25T17:00:05.457 に答える
0

$rReq変数を関数内に表示するには、変数をそこで宣言するか、引数として渡すか、またはを使用globalして変数をプルする必要があります。

function failed()
{
    global $rReq;
    $qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'");
    ...

関数の外部からの変数はその内部に自動的に表示されず、関数の内部からの変数はその外部に表示されません。

于 2012-12-25T16:59:14.753 に答える