0

私は次のコードを持っています。

echo "<form><center><input type=submit name=subs value='Submit'></center></form>";

$val=$_POST['resulta']; //this is from a textarea name='resulta'
if (isset($_POST['subs'])) //from submit name='subs'
{
    $aa=mysql_query("select max(reservno) as 'maxr' from reservation") or die(mysql_error()); //select maximum reservno
    $bb=mysql_fetch_array($aa);
    $cc=$bb['maxr'];
    $lines = explode("\n", $val);
    foreach ($lines as $line) {
        mysql_query("insert into location_list (reservno, location) values ('$cc', '$line')")
          or die(mysql_error()); //insert value of textarea then save it separately in location_list if \n is found
    }

テキストエリアに次のデータを入力すると(予約テーブルから最大予約番号「00014」があると仮定します)、

Davao - Cebu
Cebu - Davao

次に送信すると、location_listテーブルに次のデータが含まれます。

loc_id || reservno || location
00001  || 00014    || Davao - Cebu
00002  || 00014    || Cebu - Davao

次に、このコード:

$gg=mysql_query("SELECT  GROUP_CONCAT(IF((@var_ctr := @var_ctr + 1) = @cnt, 
                            location, 
                            SUBSTRING_INDEX(location,' - ', 1)
                           ) 
                           ORDER BY loc_id ASC
                           SEPARATOR ' - ') AS locations

    FROM location_list, 
         (SELECT @cnt := COUNT(1), @var_ctr := 0 
          FROM location_list 
          WHERE reservno='$cc'
         ) dummy
    WHERE reservno='$cc'") or die(mysql_error()); //QUERY IN QUESTION
    $hh=mysql_fetch_array($gg);
    $ii=$hh['locations'];
    mysql_query("update reservation set itinerary = '$ii' where reservno = '$cc'")
      or die(mysql_error());

で予約テーブルを更新することになっています'Davao - Cebu - Davao'が、代わりにこれを返し'Davao - Cebu - Cebu'ます。以前はこのフォーラムの助けを借りてこのコードを機能させることができましたが、現在は別の問題に直面しています。それを機能させることはできません。私を助けてください。前もって感謝します!

4

2 に答える 2

0

データベースサーバーは、クエリを書き換えて実行を最適化することができます。これは、個々のパーツの順序、特にさまざまな割り当てが実行される順序に影響を与える可能性があります。このような再利用により、クエリの結果が未定義になり、sqlfiddleで機能するが、実際の本番システムでは機能しないと思います。

問題が発生する正確な場所に指を置くことはできませんが、問題の核心はSQLがリレーションで機能することを目的としているという事実であると思いますが、シーケンシャルプログラミングでSQLを悪用しようとします。可変ハッカーを使用せずにポータブルSQLを使用してデータベースからデータを取得し、PHPを使用して必要な後処理を実行することをお勧めします。PHPは、作成しているアイデアを表現するのにはるかに適しています。ステートメントの最適化や並べ替えが邪魔になることはありません。また、クエリの結果は現在1つの値のみであるため、PHPコードで複数の行をフェッチし、それらを1つの値に結合しても、複雑さが増すことはありません。


編集:

同様の手法を使用して別の回答について話し合っ ているときに(コードの基になっている回答と同じように、Omeshも)、 MySQLのマニュアルでこれを見つけました。

原則として、ユーザー変数に値を割り当てたり、同じステートメント内で値を読み取ったりしないでください。期待どおりの結果が得られる場合がありますが、これは保証されていません。ユーザー変数を含む式の評価の順序は未定義であり、特定のステートメントに含まれる要素に基づいて変更される可能性があります。さらに、この順序は、MySQLサーバーのリリース間で同じであるとは限りません。

したがって、これらの変数の割り当てが評価される順序についての保証はありません。したがって、クエリが期待どおりに実行されるという保証はありません。動作する可能性はありますが、突然、予期せず失敗する可能性があります。したがって、結果の有効性をチェックするための何らかの信頼性メカニズムがない場合、または結果が有効であるかどうかを本当に気にしない場合を除いて、このアプローチを避けることを強くお勧めします。

于 2012-09-03T08:45:45.013 に答える
0

ORDER BY loc_id ASCphpMyAdmin操作loc_idを昇順で設定している限り、(なしで)機能しました。しかし、すべてのデータを削除すると、loc_idの降順として戻るため、リセットする必要があります。それは問題を完全に解決するわけではありませんが、これは私ができる限りのことだと思います。:))テーブル列loc_idが常に昇順であることを確認する必要があります。みなさん、ありがとうございました!ほんとうにありがとう!ただし、テーブルの列を常に昇順で設定する方法や、より適切なクエリなど、より適切な回答がある場合は、ここに投稿してください。神のご加護がありますように!

于 2012-09-03T09:13:15.137 に答える