Php 试图在sql查询中获取非对象的属性
我有以下SQL查询:Php 试图在sql查询中获取非对象的属性,php,mysql,Php,Mysql,我有以下SQL查询: SET @rank=0; SELECT receivedData.* FROM (SELECT @rank:=@rank+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1; 当我在服务器上的phpmyadmin上运行此操作时,一切正常 但是,当我使用php运行它时,会出现以下错误: 您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了
SET @rank=0; SELECT receivedData.* FROM (SELECT @rank:=@rank+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;
当我在服务器上的phpmyadmin上运行此操作时,一切正常
但是,当我使用php运行它时,会出现以下错误:
您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在第1行的“SELECT receivedData.*FROM SELECT@rank:=@rank+1 AS rank,ID FROM data ORDER BY”附近使用的正确语法
我真的不明白为什么它不能在php中工作,正如Patrick建议的那样,您可以尝试:
$sSQL = "SET @rank=0;";
if($conn->query($sSQL)){
$sSQL = "SELECT receivedData.* FROM (SELECT @rank:=@rank+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;";
$conn->query($sSQL);
}
$conn->query一次只执行一个命令。从手册:
查询在单个函数调用中执行SQL语句,如果有结果集,则返回该语句作为PDOStatement对象返回的结果集
因为您正在重新使用连接,所以查询应该仍然可以访问本地变量。正如Patrick建议的那样,您可以尝试:
$sSQL = "SET @rank=0;";
if($conn->query($sSQL)){
$sSQL = "SELECT receivedData.* FROM (SELECT @rank:=@rank+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;";
$conn->query($sSQL);
}
$conn->query一次只执行一个命令。从手册:
查询在单个函数调用中执行SQL语句,如果有结果集,则返回该语句作为PDOStatement对象返回的结果集
因为您正在重用连接,所以查询应该仍然可以访问本地变量。您可以组合这两个查询
SET @rank=0;
SELECT
receivedData.*
FROM (
SELECT
@rank := @rank + 1 AS rank
, ID
FROM
data
ORDER BY
Eindtijd ASC
)
AS receivedData
ORDER BY ID DESC LIMIT 1;
进入
您可以组合这两个查询
SET @rank=0;
SELECT
receivedData.*
FROM (
SELECT
@rank := @rank + 1 AS rank
, ID
FROM
data
ORDER BY
Eindtijd ASC
)
AS receivedData
ORDER BY ID DESC LIMIT 1;
进入
使用PDO,您可以执行以下操作:
$db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'password');
$statement = $db->prepare('SET @rank = "1"; SELECT receivedData.* FROM (SELECT @rank:=@rank+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;');
$statement->execute();
do {
$data = $statement->fetchAll(\PDO::FETCH_ASSOC);
var_dump($data);
} while ($statement->nextRowset());
第一个返回的数组将为空,因为第一个查询没有返回任何内容。第二个返回的数组将保存您的数据。使用PDO,您可以执行以下操作:
$db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'password');
$statement = $db->prepare('SET @rank = "1"; SELECT receivedData.* FROM (SELECT @rank:=@rank+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;');
$statement->execute();
do {
$data = $statement->fetchAll(\PDO::FETCH_ASSOC);
var_dump($data);
} while ($statement->nextRowset());
第一个返回的数组将为空,因为第一个查询没有返回任何内容。第二个返回的数组将保存您的数据。您必须在两个不同的命令中执行这些命令。请尝试在表周围使用倒勾“`”,在值周围使用列名和引号。数据库可能不知道哪个是哪个。@PatrickQ该如何工作?尝试单独执行查询。@PatrickQ是正确的,这是设置秩变量的第一个查询,第二种方法是执行真正的SQL,您必须在两个不同的命令中执行这些命令。请尝试在表周围使用反勾号``并在值周围使用列名和引号。可能数据库不知道哪个是哪个。@PatrickQ如何工作?请尝试单独执行查询。@PatrickQ是对的,第一个查询用于设置秩变量,第二个查询用于执行真正的SQLSQL感谢您的解释!欢迎您,如果这解决了您的问题,请将其标记为已接受的答案。哇,对不起..谢谢您的解释!欢迎您,如果这解决了您的问题,请标记为已接受的答案。哎呀,对不起。。