【问题标题】:php mysqli prepared statementphp mysqli 准备好的语句
【发布时间】:2011-03-21 16:50:44
【问题描述】:

嘿,我有一个快速的。有没有办法将变量包含到准备好的查询中?示例:

$sql = "SELECT id, title, author, LEFT(description, 40) AS excerpt, 
               image_small, image_med, date 
        FROM posts 
        ORDER BY id DESC 
        LIMIT $start, $postsPerPage";

$result = $connect->prepare($sql) or die ('error');
$result->execute();
$result->bind_result($id, $title, $author, $excerpt, $image_small, $image_med, $date);

谢谢!

【问题讨论】:

  • 您的问题不完整,我想您想问的是:如何从准备好的查询中检索结果。在您致电 $result->fetch() 之前,您的结果变量将为空

标签: php mysqli prepared-statement


【解决方案1】:

您想要以下内容:

$start = 1; $postsPerPage = 1;
$sql = "SELECT id, title, author, LEFT(description, 40) AS excerpt, 
               image_small, image_med, date 
        FROM posts 
        ORDER BY id DESC 
        LIMIT ?, ?";

$stmt = $connect->prepare($sql) or die ('error');
$stmt->bind_param('ii', $start, $postsPerPage);
$stmt->execute();
$stmt->bind_result($id, $title, $author, $excerpt, $image_small, $image_med, $date);

while($stmt->fetch()) {
  printf('<h1>%s</h1><p>%s <small> by %s on %s</small></p>',
    htmlspecialchars($title),
    htmlspecialchars($excerpt),
    htmlspecialchars($author),
    htmlspecialchars($date)
  );
}

这会将两个问号绑定到整数 (i) 值 $start$postsPerPage直接在准备好的语句中使用变量,因为这会破坏准备好的语句的全部目的(除了消除解析时间)

【讨论】:

  • 嗯,这正是我写的,同样的顺序和一切。变量在所有这些之前被声明,所以我不知道为什么它不显示..
  • @tim:不,不一样。您将变量直接插入到您的 sql 字符串中(没有转义发生!)。您的问题可能具有误导性,我想您在那之后会想念$result-&gt;fetch()
  • 我想我当时很困惑。我应该在什么时候为这些绑定变量赋值?
  • 你不应该给它们赋值。 $result-&gt;fetch() 根据您的查询设置它们。 $start$postsPerPage 显然必须在调用 $result-&gt;execute() 之前设置。试试我的代码,它应该打印你的数据库内容列表
  • 啊,看看我试图做的是根据我已经拥有的变量设置我的限制。它们来自另一个查询,该查询根据存储在另一个表中的设置来设置列表的数量。那么有没有办法通过该查询传递变量?
【解决方案2】:
  • 在您希望变量值所在的 SQL 中使用问号作为占位符。
  • 使用mysqli_stmt::bind_param 将值绑定到占位符。

【讨论】:

    【解决方案3】:

    如果我没记错的话,您必须使用 bindParam 并将查询中的变量替换为问号

    $sql = "SELECT id, title, author, LEFT(description, 40) AS excerpt, 
                   image_small, image_med, date 
            FROM posts 
            ORDER BY id DESC 
            LIMIT ?, ?";
    
    $result = $connect->prepare($sql) or die ('error');
    $result->bindParam(1, $start);
    $result->bindParam(2, $postsPerPage);
    

    您可以在http://php.net/manual/en/pdo.prepared-statements.php找到更多示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多