Php pdo 从 mysql 变量执行查询

Php pdo execute query from mysql variable

提问人:Premlatha 提问时间:10/10/2023 更新时间:10/10/2023 访问量:59

问:

我正在创建动态 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 查询

php sql mysql pdo

评论

1赞 Your Common Sense 10/10/2023
但。。。如果出于某种奇怪的原因,您为什么不选择 * 然后丢弃 PHP 中的 pri 键呢?不过,如果你想严格地从模式中获取名称,为什么不在PHP中连接呢?哪个更简单、更快捷、更方便?而且,毕竟,您只需选择您的 SQL 变量,然后将其用作 PDO 的常规查询。

答:

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 变量执行查询”,答案也是“选择那个愚蠢的变量并在查询/准备中以通常的方式使用它返回的字符串”。