-2

エラーなしで編集されたスクリプトを次に示します。そして、2つの修正が適用されました。部分的に助けてくれた人に感謝します。コードが不明確または乱雑であることに言及することは重要ではありません。以下のほとんどが mysql クエリの一般的な構造であることを考慮してください。mysql のサンプル ドキュメントでさえ、この類似したフローに従いました。返信するメンバーは、無意味なインターネットの冗談を否定する必要があります。それはあなたの時間の価値があり、私自身がそうする価値があります。トピックにとどまり、支援してくれた人に感謝します。

例えば:

$row = mysqli_fetch_row(mysqli_query($con, "SELECT test_table.points FROM test_table WHERE test_table.key = '" . $key . "'")); if ($row[0] > 0){ // 存在する

true の場合、$row はゼロ以外の結果を返します。それ以外の場合は false で 0。mysqli_fetch_row や mysqli_query をチェックする必要はほとんどありません。シンプルに $row をチェックするので、問題なく動作します。一般的な存在条件では、mysqli_fetch_row および/または mysqli_query を個別にチェックする必要はありません。存在する/存在しない結果を正確に提供します。$row だけの $result $row $query はありません。

その通常のフローから逸脱しているのは、call_user_func を使用したいという私の願望でした。そして、$_GET を介して func と params をポーリングします。PDOをもっと見ていきます。ただし、 exec の前のクリーンなコードは、今のところ問題なく機能するはずです。これは、実行前にクリーンアップすることです。

全体として、コードは正常に機能します。それ以来、mysql データベースを管理するためにさらに多くのことを書いてきました。書き込みから、チャンクの書き込み、読み取り、チャンクの読み取り、削除、チャンクの削除。

また、リクエストに応じて番号付きレコードを収集します。たとえば、同じ John Smith に対して 6 つのレコードがあるとします。これらのレコードの違いを照合およびスキャンできるようになりました。欲しいもの、欲しくないものなどのいずれかです。または、John Smith の最初の 3 つのレコードをやみくもに呼び出したいとします。


mysqli_fetch_row と mysqli_fetch_row の修正:

FROM関数の外部で $con を呼び出してから、mysql に従って呼び出します。mysqli のどれが期待どおりに機能しません。$con の処理方法に関して、関数にエラーはありませんでした。

TO追加されたグローバル $con だけを使用して、関数内で $con を呼び出します。これでも $GLOBALS を使用してしまう可能性があります。

結果: 関数の外側で $con を呼び出してから、mysql で正常に動作します。mysqli では、関数内で global を設定する必要があります。つまり、グローバル $con です。または失敗します。



call_user_func 重大ではないエラーの修正:

FROM call_user_func($func($_GET['user'],$_GET['key'],$_GET['points'],$_GET['type']));

TO call_user_func($func,$_GET['user'],$_GET['key'],$_GET['points'],$_GET['type']);

結果: 両方の行が正しく実行されます。重大ではないエラーで実行されましたTOも同じことを行いますが、次の重要でないエラーはありません。

両方のサンプル出力: user=MY_Name;key=34342$ee56i1;points=1234;type=


-- 修正により問題が解決されたため、コードは削除されました --

4

3 に答える 3

0

call_user_func を間違って使用しています。手動のcall_user_func の最初のパラメーターはコールバックです。この場合、それはクラス内の関数であるため、次のようにする必要があります。オブジェクトに非静的関数がある場合:

class Test{
    public  function doit($a){
        echo($a);
    }
}

$t = new Test();

call_user_func(array($t,'doit'),'asfaasfs');

オブジェクト内の静的関数では:

class Test{
    public static function doit($a){
        echo($a);
    }
}    

call_user_func('Test::doit','asfaasfs');
于 2013-03-20T13:41:15.140 に答える
0

いくつか問題があります。

  1. $conクラス外で宣言されているため、クラス内では使用できません。それをクラスに渡す (より良いオプション) か、グローバルとして指定する (quick+dirty オプション) 必要があります。

  2. mysqli_fetch_row(mysqli_query($con,'...'))
    このコードは明らかに古いmysql_xx()コードから直接変換されていますが、あまり良くありません。

    によって返される可能性のあるエラー状態を無視していますmysqli_query()。これは、失敗した場合、関数に渡さfalseれることを意味します。関数は、クエリでエラーが何であったかを実際に伝えるのではなく、意味のないエラーで失敗します。mysqli_fetch_row()expects parameter 1 to be mysqli_result

    問題は、上記の最初のポイント$conが設定されていないため、mysqli_query()失敗しているためです。これが、でエラーが発生する理由ですmysqli_fetch_row()

    理想的には、このコードを複数の行に分割する必要があります。単独で呼び出しmysqli_query()てから、いくつかのエラー チェックを行いmysqli_fetch_row()、クエリが実際に機能したことを確認してから呼び出します。

ここで問題が何であるかを説明するのに役立つことを願っています。この 2 つの点を解決すれば、全体の整理に向けて順調に進んでいるはずです。

これらの致命的なエラーを取り除いたら、時間をかけて、コードが SQL インジェクション攻撃に対して脆弱であるという問題にも取り組む必要があります。$_GET現在、変数を無害化せずにクエリ文字列に直接渡しています。これにより、システムが非常に脆弱になり、ハッキングされやすくなります。パラメーター化されたクエリの使用を検討する必要があります。これは、安全かつ確実な方法で SQL クエリの変数を簡単に処理できるように設計された mysqli ライブラリの機能です。

于 2013-03-20T14:10:17.407 に答える
-1

あなたのクラスは現時点では無意味です。おそらく、命令型スタイルのコードを書くことに固執してください。少なくともクリーンになるからです。

現時点では、$con を MYsql クラスに渡して、グローバル変数としてアクセスしようとするのではなく、それ自体をリソースとして使用する必要があります。

ユーザーの入力もフィルタリングしていません。これは危険であり、サイトへの SQL インジェクション攻撃につながる可能性があります。

この 2 つの記事を一読することをお勧めします。また、これらを理解したら、準備済みステートメントで PDO を使用するように単純に切り替えることもお勧めします。これにより、コードで現在許可されている SQL インジェクション攻撃が阻止されます。

http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/ http://net.tutsplus.com/tutorials/php/why-you-should-be- using-phps-pdo-for-database-access/

于 2013-03-20T13:39:33.400 に答える