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
    }

如果我在 textarea 上输入以下数据(假设我从预订表中有最大的 reservno '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

ORDER BY loc_id ASC只要我将 phpMyAdmin 操作 loc_id 升序设置,我就可以正常工作(没有)。但是每当我删除所有数据时,它都会以 loc_id 降序返回,所以我必须重置它。它并不能完全解决问题,但我想这是我能做到的。:)) 我只需要确保表列 loc_id 始终按升序排列。谢谢你们每一个人的帮助!对此,我真的非常感激!但是,如果您有更好的答案,例如如何将表格列设置为始终按升序排列或更好的查询等,请随时在此处发布。愿上帝保佑你们!

于 2012-09-03T09:13:15.137 回答
0

允许数据库服务器重写您的查询以优化其执行。这可能会影响各个部分的顺序,尤其是执行各种分配的顺序。我假设一些这样的重新编码会导致查询的结果变得未定义,这样它就可以在 sqlfiddle 上运行,但不能在您的实际生产系统上运行。

我无法确定出错的确切位置,但我认为问题的核心在于 SQL 旨在处理关系,但您却试图滥用它进行顺序编程。我建议您使用可移植的 SQL 从数据库中检索数据,而无需任何变量骇客,然后使用 PHP 执行您可能需要的任何后处理。PHP 更适合表达您正在制定的想法,并且不会对语句进行优化或重新排序。由于您的查询目前只产生一个值,因此在 PHP 代码中获取多行并将它们组合成一个值不会增加太多复杂性。


编辑:

在使用类似技术讨论 另一个答案时( Omesh也是如此,就像您的代码所基于的答案一样),我在MySQL 手册中发现了这一点:

作为一般规则,您永远不应为用户变量赋值并在同一语句中读取该值。您可能会得到预期的结果,但这不能保证。涉及用户变量的表达式的求值顺序是未定义的,并且可能会根据给定语句中包含的元素而改变;此外,不保证此顺序在 MySQL 服务器的版本之间是相同的。

因此,无法保证这些变量分配的评估顺序,因此无法保证查询符合您的预期。它可能会起作用,但它可能会突然而意外地失败。因此我强烈建议你避免这种方法,除非你有一些可靠的机制来检查结果的有效性,或者真的不关心它们是否有效。

于 2012-09-03T08:45:45.013 回答