Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php pdo中使用SQL准备语句_Php_Mysql_Pdo - Fatal编程技术网

如何在php pdo中使用SQL准备语句

如何在php pdo中使用SQL准备语句,php,mysql,pdo,Php,Mysql,Pdo,我在mysqlWorkbench中为sql创建了prepared语句,它为我提供了正确的结果,但是当我尝试对php-pdo使用相同的查询时,它返回了一个空数组 那么如何将我准备好的语句与php pdo一起使用呢 这是我的代码: <?php $dbh = new PDO('mysql:host=localhost;dbname=db', 'user', 'pass'); $pstmt = "set @sql = null; select

我在mysqlWorkbench中为sql创建了prepared语句,它为我提供了正确的结果,但是当我尝试对php-pdo使用相同的查询时,它返回了一个空数组

那么如何将我准备好的语句与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);


?>
查看这是否有帮助:

$conn = new PDO('mysql:host=localhost;dbname=tabela_nome','user','pass');

try{
    $select= "SELECT * from user_ WHERE email=:'email@email.com'";
    $result = $conn->prepare($select);
    $result->execute();
} catch(PDOException $e){       
   echo $e->getMessage();
}
您的“prepared”语句易于SQL注入

因为您并不是在准备真正的查询,而是在模拟一个准备好的语句,而实际上使用的是相同的旧的脏连接和手动转义

因此,在您的案例中使用SQLPrepared语句并不是唯一的原因


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

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

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

 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代码

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


$pstmt = "call GetResult()"; 


$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);

?>

这是一个关于php预准备语句和存储过程的链接

不确定准备正在准备的东西是否有意义。我给出的解决方案是否易于SQL注入?如果是,如何修改代码?是的,很容易。很难说,因为您使用的是一种不自然的数据库方式