0

セキュリティ上の利点が追加されたため、mysqli への変換を開始したところです。ただし、mysqli に変換する主な理由はmysqli_multi_query関数でした。多くの JOINS を含む長くて複雑なクエリがいくつかありましたが、この関数を知ったとき、すべてを個別のクエリに分割することで簡単にできると思いました。

しかし、クエリを思いどおりに動作させることができず、PHP マニュアルも役に立ちません。

これが私がこれまでに持っているものです。

$qry = "SELECT T.T_ID, T.name, T.pic, T.timestamp AS T_ts,
                        (SELECT COUNT(*) FROM track_plays WHERE T_ID = T.T_ID) AS plays,
                        (SELECT COUNT(*) FROM track_downloads WHERE T.T_ID = T_ID) AS downloads
                        FROM tracks T WHERE ID = '$ID';
                        ";
$qry .= "SELECT S_ID, status, timestamp AS S_ts FROM status WHERE ID = '$ID';";
$qry .= "SELECT G_ID, gig_name, date_time, lineup, price, ticket, venue, G_pic, timestamp AS G_ts FROM gigs WHERE ID = '$ID'"; 

// Execute multi query
if (mysqli_multi_query($con,$qry)){
    do {
        // Store first result set
        if ($result=mysqli_store_result($con)){
            while ($row=mysqli_fetch_array($result)){
                print_r($row);
            }
        }
    }
    while (mysqli_next_result($con));
}

これは正常に機能し、配列は期待どおりに出力されます。ただし、後で使用するために多くの変数を設定したいと考えています。すべての変数をリストするわけではありませんが、このような変数がいくつかあります。

$S_ID = htmlspecialchars($row['S_ID']);
$T_ID = htmlspecialchars($row['T_ID']);
$G_ID = htmlspecialchars($row['G_ID']);

変数は取得されますが、関数のループの性質により、$S_IDまたは$G_IDが定義されていないことを示す PHP エラーが表示されます。$T_IDループオーバーされていない最初のクエリであるため、未定義のエラーは発生しません。

さらに情報が必要な場合、または十分に説明していない場合は、お問い合わせください。

4

2 に答える 2

1

少し前に同じ問題があり、同じ理由で mysql から mysqli に移行しました。悲しいことに、途中で気づいたように、多くの場合、それは最善の解決策ではありませんでした. mysqli とマルチ クエリを使用して実装している間、mysql で発生したいくつかの問題がまだありました。

私がお勧めする解決策は、複雑なクエリでビューを使用することです。コーディングとクエリの複雑さが大幅に軽減されます。

あなたが探していた答えではないことは承知していますが、考えてみてください。

于 2013-06-08T13:12:56.067 に答える
0

これまでのところ、mysqli_multi_query を使用するたびに、do-while 条件は次のようになります。

while(mysqli_more_results($connection) && mysqli_next_result($connection));

while ステートメントを置き換えて、それが役立つかどうかを確認したい場合があります。

そうでない場合、これらの $S_ID、$G_ID 変数を割り当てるときに、後続の各クエリを区別していますか? 空の $row[] 値で変数を誤って上書きしていませんか?

コードに mysqli_free_result($result) も表示されませんでした。

付け合わせとして、いくつかのエラー チェックも提供します。

preg_match_all("/(?:SELECT\s(.*?),\s.*?(?:;|$))/",$qry,$first_columnname);
if (mysqli_multi_query($con,$qry)){
    do {
        if ($result=mysqli_store_result($con)){
            $query_identifier=array_shift($first_columnname[1]);
            while ($row=mysqli_fetch_array($result)){
                if($query_identifier)=="T.T_ID"){
                    //do something...
                }elseif($query_identifier)=="S_ID"){
                    //do something...
                }elseif($query_identifier)=="G_ID"){
                    //do something...
                }
            }
            mysqli_free_result($result);
        }
    }
    while(mysqli_more_results($con) && mysqli_next_result($con));
}
if($error_mess=mysqli_error($con)){echo "Error = $error_mess";}

これらの小さな変更のいずれかがうまくいくかどうか教えてください.

于 2014-03-18T15:26:25.887 に答える