我有一个问题与
mysql条件注释查询,其中错误报告没有语法错误.在这种情况下,至少有一个查询实际上是用条件执行的.
我正在使用PHP 5.6.24和MysqL 5.5.52-cll
示例1(成功):
<?PHP $conn = MysqLi_connect("127.0.0.1","aaatex_PHPpos","PHPpos","aaatex_PHPpos2"); $test1 = " /*!40000 REPLACE INTO `PHPpos_app_config` (`key`,`value`) VALUES ('supports_full_text','0') */; /*!50604 REPLACE INTO `PHPpos_app_config` (`key`,'1') */;"; MysqLi_multi_query($conn,$test1); print_r(MysqLi_error_list($conn)); ?>
supports_full_text的值为0.
示例2(失败):
<?PHP $conn = MysqLi_connect("127.0.0.1","aaatex_PHPpos2"); $test2 = " /*!50604 REPLACE INTO `PHPpos_app_config` (`key`,`value`) VALUES ('test',$test2); print_r(MysqLi_error_list($conn));
错误收到:
Array ( [0] => Array ( [errno] => 1064 [sqlstate] => 42000 [error] => You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near '; /*!50604 REPLACE INTO `PHPpos_app_config` (`key`,'1' at line 1 ) )
示例3(失败;但看起来像成功(见下面的消息):
<?PHP $conn = MysqLi_connect("127.0.0.1","aaatex_PHPpos2"); $test3 = " /*!40000 REPLACE INTO `PHPpos_app_config` (`key`,$test3); print_r(MysqLi_error_list($conn));
测试值为0.
编辑:
注意:我发现当查询失败时,STOPS处理文件的其余部分.所以例3在第2和第3查询中仍然有错误;我没有抓到所有的错误. 40000查询工作;但任何不运行当前的MysqL版本失败作为语法错误.
你在这里有误解.你的MysqL版本是5.5.52.这意味着你得到的结果是正确的.
当您在查询中说/ *!40000 … * /时,您所说的这个查询只能在高于4.0.0的MysqL版本中执行.同样,/ *!50604 … * /表示这个查询执行的MysqL版本应该高于5.6.04.记住,这些数字与MysqL版本有关.不是PHP版本.
在您的第一次测试中,首次查询执行正常,因为您的MysqL版本大于4.0.0.但是,由于您的MysqL版本低于5.6.04,因此第二个查询将被跳过.这也是在其他两个测试中发生的.
但是我无法解释为什么你会收到语法错误,
You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near '; /*!50604 REPLACE INTO `PHPpos_app_config` (`key`,'1' at line 1
在第二次测试.可能是您在此处查询的查询不是您执行的实际查询.你能检查一下吗?因为我也做了所有这些测试(我有MysqL 5.5以及PHP 5.6),我没有遇到任何错误.我只看到没有执行更高版本的查询.
有关更多阅读请参阅this article.希望我的答案帮助您.
更新
通过查看其他答案,似乎您正在面临一个罕见的bug.尝试更新您的MysqL版本.如果问题仍然存在,可能是MysqL API的错误.