使用MySQL变量时mysqli_multi_query()问题

时间:2017-11-18 23:20:19

标签: php mysql sql

我在我的php脚本中使用 public static Map<String, List> arrayMenu(ArrayList<MenuItem> menus) { ArrayList<String> menu = new ArrayList<String>(); ArrayList<Integer> entr = new ArrayList<Integer>(); ....... HashMap<String, List> map = new HashMap<>(); map.put("meun", menu); map.put("entr", entr); return map; } 。查询是:

mysqli_multi_query()

SET @firstRow=1;

我知道这个问题很混乱,但这是我能让它发挥作用的唯一方法(也许有人对此有所了解,虽然这不是这个问题的目的)

我的问题是SELECT GROUP_CONCAT(CONCAT(IF(@firstRow=1, CONCAT("Dear ", IF(@firstRow:=0, "", "")), "dear "), parents.Salutation, "", parents.Lastname) SEPARATOR ", ") AS Salutation FROM parentChildRelation, parents WHERE parents.ID = parentChildRelation.ParentID AND parentChildRelation.ChildID = $childID 无法正常工作,或者某些查询无法在mysqli_next_result()中正常工作(它可以在phpMyAdmin中运行...)。或者,最有可能的是,我犯了一个错误。

我的php脚本中的相关代码是:

mysqli_multi_query()

在玩一些mysqli_multi_query($connection, $queries); $result = mysqli_store_result($connection); for($i = 0 ; $i < $queryNumber ; $i++) { mysqli_next_result($connection); } if($result) { while($row = mysqli_fetch_array($result)) { print($row[$varName] . "\n"); } } 时,我注意到结果是var_dump

同样重要的是:当 $ queries 实际上只有一个查询时,代码工作正常。

1 个答案:

答案 0 :(得分:1)

对我而言,它看起来像是经典的XY problem。据我了解你的代码,你想要一个像&#34;亲爱的史密斯先生,亲爱的史密斯太太和#34; (例如:http://rextester.com/IGU41148)。 @firstRow的目的是写第一个&#34;亲爱的&#34;用大写&#34; D&#34;。

嗯..简化查询

SELECT GROUP_CONCAT(CONCAT("dear ", parents.Salutation, "", parents.Lastname)
                    SEPARATOR ", ") AS Salutation
FROM parentChildRelation, parents 
WHERE parents.ID = parentChildRelation.ParentID 
AND parentChildRelation.ChildID = $childID
亲爱的史密斯先生,亲爱的史密斯太太和#34; (例如:http://rextester.com/BIF63982)。

现在你可以使用PHP ucfirst(string $str) function,这将返回&#34; 一个字符串,第一个字符是 str 大写&#34; (例如:http://rextester.com/OZUI8315)。

如果你想仅使用SQL获得结果,你可以移动第一个&#34;亲爱的&#34;超出GROUP_CONCAT并使用, dear作为SEPARATOR

SELECT CONCAT("Dear ", GROUP_CONCAT(CONCAT(parents.Salutation, "", parents.Lastname)
                    SEPARATOR ", dear ")) AS Salutation
FROM parentChildRelation, parents 
WHERE parents.ID = parentChildRelation.ParentID 
AND parentChildRelation.ChildID = $childID

示例:http://rextester.com/HSFYF33827

避免SET @firstRow=1;行的另一种方法是在已加入的派生表(@firstRow)中设置(select @firstRow:=1)变量:

SELECT GROUP_CONCAT(CONCAT(IF(@firstRow=1, CONCAT("Dear ", 
                              IF(@firstRow:=0, "", "")), "dear "), 
                                 parents.Salutation, "", parents.Lastname)
                    SEPARATOR ", ") AS Salutation
FROM parentChildRelation, parents, (select @firstRow:=1) initFirstRow
WHERE parents.ID = parentChildRelation.ParentID 
AND parentChildRelation.ChildID = $childID

示例:http://rextester.com/ULXR92492

正如您所看到的,有多种方法可以避免使用@firstRow变量,还有更多方法可以避免使用mysqli_multi_query()

但是我不会使用任何这些解决方案。我要做的是执行一个简单的查询

SELECT parents.Salutation, parents.Lastname
FROM parentChildRelation
JOIN parents ON parents.ID = parentChildRelation.ParentID 
WHERE parentChildRelation.ChildID = ?

并建立&#34; Salutation&#34; PHP中的字符串。如果您使用(foreach)循环或array_map之类的东西,这并不重要。最重要的是,您,您的同事和任何审阅者都可以快速阅读和理解您的代码并轻松进行必要的更改。所以你应该花时间找一个简单的解决方案。这将为您节省更多时间。