You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP PDO实现MySQL排除主键的动态查询并获取数据问题

解决动态查询非主键列数据的问题

你当前的代码仅完成了动态SQL语句的生成,但没有执行这条语句来获取实际数据。以下是两种可行的修改方案:

方案一:在MySQL中直接执行生成的查询语句

在获取到@query后,通过MySQL的PREPARE和EXECUTE语句执行动态SQL:

// 1. 获取非主键列名并存入变量
$qry_getData = "SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'books' AND COLUMN_KEY <> 'PRI' INTO @columnName;";
$stmt_getData = $conn->prepare($qry_getData);
$stmt_getData->execute();

// 2. 拼接完整查询语句
$qry_getData = "SET @query = CONCAT('SELECT ', @columnName, ' FROM `books`');";
$stmt_getData = $conn->prepare($qry_getData);
$stmt_getData->execute();

// 3. 执行动态生成的SQL并获取数据
$qry_getData = "PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt;";
$stmt_getData = $conn->prepare($qry_getData);
$stmt_getData->execute();
$data_getData = $stmt_getData->fetchAll(PDO::FETCH_ASSOC);

// 输出结果
print_r($data_getData);

方案二:通过PDO执行生成的SQL字符串

先取出@query的内容,再用PDO准备并执行这条SQL:

// 1. 获取非主键列名并存入变量
$qry_getData = "SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'books' AND COLUMN_KEY <> 'PRI' INTO @columnName;";
$stmt_getData = $conn->prepare($qry_getData);
$stmt_getData->execute();

// 2. 拼接完整查询语句
$qry_getData = "SET @query = CONCAT('SELECT ', @columnName, ' FROM `books`');";
$stmt_getData = $conn->prepare($qry_getData);
$stmt_getData->execute();

// 3. 获取生成的SQL语句
$qry_getData = "SELECT @query AS sql_query;";
$stmt_getData = $conn->prepare($qry_getData);
$stmt_getData->execute();
$generatedSql = $stmt_getData->fetch(PDO::FETCH_ASSOC)['sql_query'];

// 4. 执行生成的SQL并获取数据
$stmt = $conn->prepare($generatedSql);
$stmt->execute();
$data_getData = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 输出结果
print_r($data_getData);

两种方案都能帮你获取到books表中非主键列的实际数据,方案二更符合PDO的常规使用习惯,也更便于后续的参数绑定(如果需要的话)。

内容的提问来源于stack exchange,提问作者Premlatha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:15:07