【问题标题】:Php and Mysqli - can you use a prepared statement on a SELECT clause that doesn't have a WHERE clause?Php 和 Mysqli - 你可以在没有 WHERE 子句的 SELECT 子句上使用准备好的语句吗?
【发布时间】:2017-01-09 16:27:19
【问题描述】:
SELECT id, title, posted, duration, thumbnail, email, first_name
FROM customers

【问题讨论】:

  • 虽然没有必要,但您可以在此查询中使用准备好的语句,许多这样做只是为了保持一致性。
  • 感谢杰伊的回复。我将如何使用我在问题中提出的示例 SQL 创建一个准备好的语句?
  • 这取决于您选择使用哪个 API(MySQLi、PDO)。了解 PDOMySQLiprepared 语句,并考虑使用 PDO,it's really pretty easy
  • 我正在使用 Mysqli api。
  • 如果您想知道/询问的内容,则无法绑定表/列。

标签: php mysqli


【解决方案1】:

这是一个简短的示例(对于 cmets 来说太长了),因为您使用的是 MySQLi:

面向对象的风格:

/* prepare query */
$stmt = $mysqli->prepare("SELECT id, title, posted, duration, thumbnail, email, first_name FROM customers");

/* execute query */
$stmt->execute();

程序风格($conn 是数据库连接):

/* prepare */
$stmt = mysqli_prepare($conn, "SELECT id, title, posted, duration, thumbnail, email, first_name FROM customers");

/* execute query */
mysqli_stmt_execute($stmt);

【讨论】:

  • 谢谢杰。那么在这种 SQL 查询中,我不会使用问号作为占位符吗?
  • 你是对的@RiggsFolly,还有其他方法。我将所有查询发送到一个函数,所以prepare() 只是架构的一部分——每个查询都由同一个函数处理。
  • 非常感谢 Jay 和 Riggs 的快速响应和洞察力,非常感谢!
  • 从发布这个问题的那一刻起我就知道我是对的,哈哈
  • @codeman “我不会使用问号作为占位符吗?” - 正如我已经说过几次,答案是“不”;-)跨度>
【解决方案2】:

由于您没有明显的理由准备此语句,即您没有说您想在此脚本中多次运行此查询,并且您没有用于将参数绑定到查询的占位符,您可以像这样简单地使用 mysqli_query()

$sql = 'SELECT id, title, posted, duration, thumbnail, email, first_name
        FROM customers';

$result = mysqli_query($con, $sql);

while ( $row = $result->fetch_assoc() ) {
    echo $row['id'];   // or whatever
}

请记住,您不能将占位符 ? 用于列名或表名,在此或 mysqli_prepare() 中,如果这是您最终要解决的问题,正如 @Fred-ii- 所建议的那样

【讨论】:

    【解决方案3】:

    作为社区 wiki 发布。

    没有什么能阻止你使用prepare()(在 MySQLi_ 中),因为它是有效的。

    你就是做不到,举几个例子:

    • SELECT col1, col2, col3 FROM ?
    • SELECT ?,?,? FROM ?
    • SELECT ?,?,? FROM table

    如果您计划/设想这样做,因为这将构成绑定表/列,这在准备好的语句中是不允许的,就像我们希望它那样工作。

    但是,没有什么可以阻止您使用所谓的“安全列表”。

    以下是一些参考资料:

    关于使用 prepare() 而不是 query() 可以在以下相关问题的答案中找到:

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2016-07-22
      相关资源
      最近更新 更多