提问人:Premlatha 提问时间:10/10/2023 更新时间:10/10/2023 访问量:59
Php pdo 从 mysql 变量执行查询
Php pdo execute query from mysql variable
问:
我正在创建动态 mysql 查询,我需要选择除主键列之外的 * 列。然后,我需要使用 pdo 在 php 中获取此列的数据。
$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();
$qry_getData="SET @query=CONCAT('SELECT ', @columnName , ' FROM `books`');";
$stmt_getData =$conn->prepare($qry_getData);
$stmt_getData->execute();
$qry_getData="SELECT @query";
$stmt_getData =$conn->prepare($qry_getData);
$stmt_getData->execute();
$data_getData =$stmt_getData->fetchAll(PDO::FETCH_ASSOC);
输出:
array(1) {
[0]=>
array(1) {
["@query"]=>
string(70) "SELECT ColA,ColB,ColC,ColD FROM `books`"
}
}
我希望此列中的数据作为输出。但是,它输出已创建的 sql 查询
答:
0赞
Bill Karwin
10/10/2023
#1
我不确定是否值得去所有这些麻烦,因为只运行这个查询不是更简单吗:
$qry_getData ="SELECT * FROM `books`";
$stmt_getData =$conn->query($qry_getData);
$data_getData =$stmt_getData->fetchAll(PDO::FETCH_ASSOC);
但我会回答你提出的问题,相信你有充分的理由从结果中省略主键列。
为什么你得到的是查询本身的结果,而不是该查询本来会生成的数据?
您定义了一个名为的字符串变量,然后选择了该变量。它恰好包含一个作为 SQL 查询的字符串这一事实无关紧要;它仍然只是一个字符串值。@query
如何获得您想要的内容,这是该表中除主键列之外的所有列的结果?
若要将该变量作为字符串执行,可以使用该语句。但这需要更多步骤:PREPARE
$qry_getData ="SET @query=CONCAT('SELECT ', @columnName , ' FROM `books`');";
$stmt_getData =$conn->exec($qry_getData);
$qry_getData ="PREPARE stmt FROM @query";
$stmt_getData =$conn->exec($qry_getData);
$qry_getData ="EXECUTE stmt";
$stmt_getData =$conn->query($qry_getData);
$data_getData =$stmt_getData->fetchAll(PDO::FETCH_ASSOC);
$qry_getData ="DEALLOCATE PREPARE stmt";
$stmt_getData =$conn->exec($qry_getData);
(在这些情况下,无需使用 PDO::p repare(),因为 SQL 语句没有参数。
从技术上讲,这是 SQL 注入,因为您不知道列名是否包含特殊关键字、标点符号、空格等。如果您无法控制列名以防止它们导致 SQL 注入,则应注意分隔它们。
然后只需返回查询,然后执行它。
$qry_getData="SELECT
GROUP_CONCAT(CONCAT('`', REPLACE(COLUMN_NAME, '`', ''), '`'))FROM
information_schema. COLUMNS WHERE
TABLE_SCHEMA = 'db1'AND
TABLE_NAME = 'books' AND
COLUMN_KEY <> 'PRI' INTO @columnName;";
$rowsAffected =$conn->exec($qry_getData);
$qry_getData ="SELECT CONCAT('SELECT ', @columnName , ' FROM `books`') AS `query`;";
$stmt_getData =$conn->query($qry_getData);
$data_getData =$stmt_getData->fetchAll(PDO::FETCH_ASSOC);
$stmt->getData =$conn->query($data_getData["query"]);
$data_getData =$stmt_getData->fetchAll(PDO::FETCH_ASSOC);
评论
2赞
Your Common Sense
10/10/2023
对我来说,所有这些 SQL 用具都毫无意义。由于它是 PHP,因此只需选择列名并在 PHP 中创建查询即可。没有 SQL 变量,没有 concat,没有 prepare,也没有额外的数据库往返。
0赞
Your Common Sense
10/10/2023
即使是通用问题,“如何使用 PDO 从 mysql 变量执行查询”,答案也是“选择那个愚蠢的变量并在查询/准备中以通常的方式使用它返回的字符串”。
评论