如何在php pdo中使用SQL预处理语句

时间:2016-04-05 16:21:38

标签: php mysql pdo

我为sql创建了准备好的语句,它在 mysqlWorkbench 中给出了正确的结果,但当我尝试使用与 php pdo 相同的查询时,它会返回一个< em>空数组。

那么如何在 php pdo 中使用我准备好的语句?

这是我的代码:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=db', 'user', 'pass');


$pstmt = "set @sql = null;
            select 
              group_concat(distinct
                 concat(
                     'MAX(IF(ch.ch_name = ''', replace(ch.ch_name, '''', '\''''), ''', v.v_value, NULL)) AS ''', replace(ch.ch_name, '''', ' ') , ''''
                 )
            ) into @sql
            FROM e_champ ch
            join e_champ_value v on v.v_fk_champ_id = ch.ch_id
            join e_collecte c on c.c_id = v.v_fk_collecte_id
            AND c.c_id = 2;

            set @sql = concat('select oi.oi_id, ', @sql, ' from e_order_item oi 
                  left join e_champ_value v on v.v_fk_order_item_id = oi.oi_id
                  join e_champ ch on ch.ch_id = v.v_fk_champ_id
                  join e_collecte c on c.c_id = v.v_fk_collecte_id
                  AND c.c_id = 2 GROUP BY oi_id');

            PREPARE stmt FROM @sql;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;"; 


$sth = $dbh->prepare($pstmt);
$sth->execute();

/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll();
print_r($result);


?>

3 个答案:

答案 0 :(得分:0)

你准备好的&#34;语句很容易出现SQL注入。

因为你没有准备你的查询真实,只是模仿准备好的声明,而实际上使用相同的旧脏连接和手动转义。

因此,在您的情况下使用SQL预处理语句没有一个理由。

无论如何,要回答标题中的问题,要运行任何 sql查询,无论是SQL预处理语句还是没有,都必须使用query()方法,运行在单独的query()调用中分隔SQL查询。

答案 1 :(得分:0)

我找到了一个能给我正确结果的解决方案。

我在数据库中创建了一个存储过程,然后在php pdo中调用它。

not_analyzed

// PHP代码

 DELIMITER $$


    CREATE PROCEDURE GetResult()
    BEGIN

    set @sql = null;
                select 
                  group_concat(distinct
                     concat(
                         'MAX(IF(ch.ch_name = ''', replace(ch.ch_name, '''', '\''''), ''', v.v_value, NULL)) AS ''', replace(ch.ch_name, '''', ' ') , ''''
                     )
                ) into @sql
                FROM e_champ ch
                join e_champ_value v on v.v_fk_champ_id = ch.ch_id
                join e_collecte c on c.c_id = v.v_fk_collecte_id
                AND c.c_id = 2;

                set @sql = concat('select oi.oi_id, ', @sql, ' from e_order_item oi 
                      left join e_champ_value v on v.v_fk_order_item_id = oi.oi_id
                      join e_champ ch on ch.ch_id = v.v_fk_champ_id
                      join e_collecte c on c.c_id = v.v_fk_collecte_id
                      AND c.c_id = 2 GROUP BY oi_id');

                PREPARE stmt FROM @sql;
                EXECUTE stmt;
                DEALLOCATE PREPARE stmt;

    END$$

这是关于php preapared语句和存储过程的链接 http://php.net/manual/en/pdo.prepared-statements.php

答案 2 :(得分:-2)

看看这是否有帮助:

{{1}}