Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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执行mysql数据透视语句_Php_Mysql_Pdo - Fatal编程技术网

使用php PDO执行mysql数据透视语句

使用php PDO执行mysql数据透视语句,php,mysql,pdo,Php,Mysql,Pdo,我已经在命令行中准备好了Mysql语句。如何让它与PHP PDO prepare语句一起工作 set @sql = null; SET group_concat_max_len=15000; select group_concat(distinct concat('sum(if(date=''',date_format(date,'%Y-%m-%d'),''',total,null)) as ', date_format(date,'dd%Y%m%d'))) into @sql from sa

我已经在命令行中准备好了Mysql语句。如何让它与PHP PDO prepare语句一起工作

set @sql = null;
SET group_concat_max_len=15000;

select group_concat(distinct concat('sum(if(date=''',date_format(date,'%Y-%m-%d'),''',total,null)) as ', date_format(date,'dd%Y%m%d'))) into @sql from sales where date_format(date,'%m%y')='0615';

set @sql = concat('select ',@sql,'  from sales');

PREPARE stmt FROM @sql;
EXECUTE stmt;

在这种情况下,您不需要在PDO中使用准备好的语句

粘贴的代码是获取在纯SQL中工作的动态生成语句的唯一方法


由于涉及PHP,您应该在for循环中生成该SQL,并使用PDO::query方法执行它。

您可以在PHP中而不是SQL中执行组连接

$pdo->query("SET group_concat_max_len = 15000");
$stmt1 = $pdo->prepare("select distinct concat('sum(if(date=''',date_format(date,'%Y-%m-%d'),''',total,null)) as ', date_format(date,'dd%Y%m%d')) as col from sales where date_format(date,'%m%y')= :mmyy";
$stmt1->execute(":mmyy" => '0615');
$cols = $stmt1->fetchAll(PDO::FETCH_COLUMN, 0);
$cols_string = implode(',' $cols);
$sql = "SELECT $col_string FROM sales";
$stmt2 = $pdo->prepare($sql);
$stmt2->execute();

因为我不想使用循环,这是最接近的答案。但是我真的很想在一个执行语句中执行,有可能吗?您粘贴的SQL代码不是一个语句,它由6个单独的语句组成。@Prahc由于PDO不允许您在一个调用中执行多个查询,因此您必须使用这些语句执行6个查询。这有什么意义?您可以编写一个MySQL存储过程来执行此操作,然后调用该过程。@Barmar我不熟悉存储过程。你能根据我的代码给出一个例子吗?请阅读MySQL网站上的文档。基本上,您只需将所有代码包装在一个
CREATE PROCEDURE
语句中,为其命名,然后使用
CALL procedureName
来运行它。感谢Naktibalda,我知道如何做到这一点,但我想我可以使用单个查询字符串来实现它,而不涉及循环。