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
相关产品推荐
相关产品推荐

