如何使用数据库扩展PDO在PHP中编写多查询

时间:2018-08-18 06:16:51

标签: php mysql pdo

我想编写这个MYSQL查询

interface MyObjectInterface {
   name: string;
   ...
}

private itemDoc: AngularFirestoreDocument<MyObjectInterface>; 内使用数据库扩展SET @val := 0; SELECT `my_table`.* FROM `my_table` HAVING (@val := @val + 1) > 0; 进行编码!

我已经看到PHPPDO,但我不知道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> 似乎没有通过查询!所以有什么主意

4 个答案:

答案 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;