Php 错误语法导致MySQL查询出错
我正在尝试制作一些PHP,根据从URL获取的内容创建查询。我很确定我已经接近完成它所需的代码了,但是我的语法不正确。其思想是,它在URL?companys=bla,bla,bla(我存储在一个数组中)中遍历所有公司,然后为每个公司回显$query的SQL语句的一部分我知道我的代码会出错。我完全知道这一点,但如果没有正确的语法,我无法调试它。如果有人能纠正我的语法,我将不胜感激 谢谢Php 错误语法导致MySQL查询出错,php,sql,Php,Sql,我正在尝试制作一些PHP,根据从URL获取的内容创建查询。我很确定我已经接近完成它所需的代码了,但是我的语法不正确。其思想是,它在URL?companys=bla,bla,bla(我存储在一个数组中)中遍历所有公司,然后为每个公司回显$query的SQL语句的一部分我知道我的代码会出错。我完全知道这一点,但如果没有正确的语法,我无法调试它。如果有人能纠正我的语法,我将不胜感激 谢谢 $companies = $_GET['companies']; $companiesArray = explod
$companies = $_GET['companies'];
$companiesArray = explode(',', $companies);
$companiesArrayLength = count($companiesArray);
$query = $db->query(
for ($i = 0; $i < $companiesArrayLength; $i++) {
echo "SELECT * FROM " . $companiesArray[$i] . " UNION ALL";
}
//echo " ORDER BY timestamp DESC LIMIT 50";
);
$companys=$\u GET['companys'];
$companiesArray=explode(“,”,$companies);
$companiesArrayLength=计数($companiesArray);
$query=$db->query(
对于($i=0;$i<$companiesArrayLength;$i++){
回显“从“$companiesArray[$i]”中选择*。“联合所有”;
}
//echo“按时间戳顺序描述限制50”;
);
因此您的代码最终将
SELECT * FROM a UNION ALL
...
SELECT * FROM k UNION ALL
最终的联合是不需要的,这就是为什么你会得到错误。将其删除,使其看起来像:
SELECT * FROM a UNION ALL
...
SELECT * FROM k
它应该执行。确保每个表中的列数也相同 因此您的代码最终将
SELECT * FROM a UNION ALL
...
SELECT * FROM k UNION ALL
最终的联合是不需要的,这就是为什么你会得到错误。将其删除,使其看起来像:
SELECT * FROM a UNION ALL
...
SELECT * FROM k
它应该执行。确保每个表中的列数也相同 不能将
回送到函数参数中(query()
)。相反,构建一个字符串,然后执行整个查询:
$querystring = "";
for ($i = 0; $i < $companiesArrayLength; $i++) {
$querystring .= "SELECT * FROM " . $companiesArray[$i];
// no UNION ALL after the last part
if($i != $companiesArrayLength-1){
$querystring .= " UNION ALL";
}
}
$querystring .= " ORDER BY timestamp DESC LIMIT 50";
$query = $db->query($querystring);
$querystring=”“;
对于($i=0;$i<$companiesArrayLength;$i++){
$querystring.=“从“$companiesArray[$i]”中选择*;
//在最后一部分之后没有工会
如果($i!=$CompanyArrayLength-1){
$querystring.=“联合所有”;
}
}
$querystring.=“按时间戳描述的订单限制50”;
$query=$db->query($querystring);
您不能将回送到函数参数中(query()
)。相反,构建一个字符串,然后执行整个查询:
$querystring = "";
for ($i = 0; $i < $companiesArrayLength; $i++) {
$querystring .= "SELECT * FROM " . $companiesArray[$i];
// no UNION ALL after the last part
if($i != $companiesArrayLength-1){
$querystring .= " UNION ALL";
}
}
$querystring .= " ORDER BY timestamp DESC LIMIT 50";
$query = $db->query($querystring);
$querystring=”“;
对于($i=0;$i<$companiesArrayLength;$i++){
$querystring.=“从“$companiesArray[$i]”中选择*;
//在最后一部分之后没有工会
如果($i!=$CompanyArrayLength-1){
$querystring.=“联合所有”;
}
}
$querystring.=“按时间戳描述的订单限制50”;
$query=$db->query($querystring);
也许你可以
foreach ($companiesArray as $company) {
$sqls[] = "SELECT * FROM ".$company;
}
$sql = implode(" UNION ALL ", $sqls);
$query = $db->query($sql);
但是,正如你所说,它非常脏也许你可以这样做
foreach ($companiesArray as $company) {
$sqls[] = "SELECT * FROM ".$company;
}
$sql = implode(" UNION ALL ", $sqls);
$query = $db->query($sql);
但是,正如您所说,它非常脏所以您的最后一个子查询不应该以UNION ALL
结束,您可以这样做吗:
$parts = array();
foreach ($companiesArray as $company)
$parts[] = "SELECT * FROM " . $company;
$query = implode(" UNION ALL ", $parts) . " ORDER BY timestamp DESC LIMIT 50";
因此,您的最后一个子查询不应以UNION ALL
结尾,您可以这样做吗:
$parts = array();
foreach ($companiesArray as $company)
$parts[] = "SELECT * FROM " . $company;
$query = implode(" UNION ALL ", $parts) . " ORDER BY timestamp DESC LIMIT 50";
试试看:
$sqlQuery=NULL
for ($i = 0; $i < $companiesArrayLength; $i++) {
if ($i != $companiesArrayLength-1 ){
$sqlQuery .= " SELECT * FROM " . $companiesArray[$i] . " UNION ALL ";
} else {
$sqlQuery .= " SELECT * FROM " . $companiesArray[$i] ;
}
}
$sqlQuery .= " ORDER BY timestamp DESC LIMIT 50";
for($i=0;$i<$companiesArrayLength;$i++){
如果($i!=$CompanyArrayLength-1){
$sqlQuery.=“从“$companiesArray[$i]”中选择*。“联合所有”;
}否则{
$sqlQuery.=“从“$companiesArray[$i]”中选择*;
}
}
$sqlQuery.=“按时间戳描述的订单限制50”;
$query=$db->query($sqlQuery)
谢谢。试试看:
$sqlQuery=NULL
for ($i = 0; $i < $companiesArrayLength; $i++) {
if ($i != $companiesArrayLength-1 ){
$sqlQuery .= " SELECT * FROM " . $companiesArray[$i] . " UNION ALL ";
} else {
$sqlQuery .= " SELECT * FROM " . $companiesArray[$i] ;
}
}
$sqlQuery .= " ORDER BY timestamp DESC LIMIT 50";
for($i=0;$i<$companiesArrayLength;$i++){
如果($i!=$CompanyArrayLength-1){
$sqlQuery.=“从“$companiesArray[$i]”中选择*。“联合所有”;
}否则{
$sqlQuery.=“从“$companiesArray[$i]”中选择*;
}
}
$sqlQuery.=“按时间戳描述的订单限制50”;
$query=$db->query($sqlQuery)
谢谢。您有公司表吗?如果有,它看起来怎么样?您非常容易受到SQL注入的攻击。@h2ooooooo我知道,我还没有添加代码来阻止它,但我知道需要做什么来阻止它。您有公司表吗,如果有,它看起来怎么样?您非常容易受到SQL注入的攻击。@H2Ooooo我知道,我还没有添加代码来阻止它,但我知道需要做些什么来阻止它。这完美地回答了我的问题,以及Andrius的查询更正。非常感谢,不客气。当你的问题解决后,请记住点击最有帮助的帖子左边的勾号,将其标记为答案。绝对正确!我只需等待计时器:P@jskidd3:我更喜欢使用foreach
和内爆
,这将导致更干净code@WouterHuysentruit只是刚刚看到你的答案,对不起。你的答案在我看来是最好的,所以你赢得了最好的答案。这完美地回答了我的问题,还有安德里奥斯的问题更正。非常感谢,不客气。当你的问题解决后,请记住点击最有帮助的帖子左边的勾号,将其标记为答案。绝对正确!我只需等待计时器:P@jskidd3:我更喜欢使用foreach
和内爆
,这将导致更干净code@WouterHuysentruit只是刚刚看到你的答案,对不起。在我看来,你的答案是最好的,所以你赢得了最好的答案。谢谢!它没有完全回答我的问题,因为我的PHP语法已关闭,但您确实更正了我的查询!:)谢谢你!它没有完全回答我的问题,因为我的PHP语法已关闭,但您确实更正了我的查询!:)