我想编写这个MYSQL查询
interface MyObjectInterface {
name: string;
...
}
在private itemDoc: AngularFirestoreDocument<MyObjectInterface>;
内使用数据库扩展SET @val := 0;
SELECT `my_table`.* FROM `my_table` HAVING (@val := @val + 1) > 0;
进行编码!
我已经看到PHP
有PDO
,但我不知道mysqli
是否通过某种方式支持多查询?!
我已经尝试过
mysqli_multi_query()
但是没有用!
PDO
,第25行是:<?PHP
// i'm connected to db
$sql = "SET @val := 0;";
$sql .= "SELECT `my_table`.* FROM `my_table` HAVING (@val := @val + 1) > 0;";
?>
<table>
<tr>
<th>id</th>
<th>name</th>
</tr>
<?PHP foreach($db->query($sql) as $row){ ?>
<tr>
<td><?php echo $row['id']; ?></td>
<td><?php echo $row['name']; ?></td>
</tr>
<?php } ?>
</table>
似乎没有通过查询!所以有什么主意
答案 0 :(得分:2)
查询工作正常。您的问题是$db->query($sql)
返回了两个结果集:第一个返回SET @val := 0
,第二个返回您实际的SELECT
查询。当您循环访问$db->query()
的结果时,您将获得第一个结果集,即SET @val := 0
的结果导致崩溃。您需要做的是切换到下一个结果集,这将需要稍微重写代码。更改:
<?PHP foreach($db->query($sql) as $row){ ?>
收件人:
<?php
$result = $db->query($sql);
$result->nextRowset();
while ($row = $result->fetch()) {
?>
答案 1 :(得分:1)
PDO应该支持多查询工作,因此您应该检查代码中的拼写错误,例如:在beetween子句之间添加空格(table HAVING
而非tableHAVING
),并对重新输入的单词使用反引号,例如:
$sql = "SET @val := 0;";
$sql .= "SELECT `table`.* FROM `table` HAVING (@val := @val + 1) > 0;";
答案 2 :(得分:1)
首先,您的脚本容易受到XSS攻击。我看不到要使用 htmlentities或htmlspecialchars()函数将输出变量转义的位置。
此代码将为您解决问题。我已经对其进行了测试,并且可以正常工作。
使用以下字段创建名为 table1 的表名称 id 和 名称
create table table1(id int primary key auto_increment, name varchar(100));
将值插入其中并使用下面的代码,但请记住要更改数据库连接属性
<?php
//connect to db
$db = new PDO (
'mysql:host=localhost;dbname=test_db;charset=utf8',
'root', // username
'' // password
);
$result = $db->prepare("SET @val := 0");
$result->execute(array());
$result = $db->prepare("SELECT `table1`.* FROM `table1` HAVING (@val := @val + 1) > 0");
$result->execute(array());
while ($row = $result->fetch())
{
//prevent xss Attack using htmlentities
$id = htmlentities($row['id'], ENT_QUOTES, "UTF-8");
$name = htmlentities($row['name'], ENT_QUOTES, "UTF-8");
//}
?>
<table>
<tr>
<th>id</th>
<th>name</th>
</tr>
<tr>
<td><?php echo $id; ?></td>
<td><?php echo $name; ?></td>
</tr>
<?php } ?>
</table>
答案 3 :(得分:1)
在堆栈溢出PHP & MySQL: How can I use "SET @rank=0;" in $query=上查看此问题
或尝试
SELECT `my_table`.* FROM `my_table` ,(SELECT @val:=0) r HAVING (@val := @val + 1) > 0;