【问题标题】:mysqli prepared statements inside or outside if then blocksmysqli 在 if then 块内部或外部准备语句
【发布时间】:2013-12-13 21:14:17
【问题描述】:

正在重做网站。升级到 mysqli,现在我正在用准备好的语句整理代码和安全性。我知道语句应该在 foreach 循环之外准备,但我想知道条件语句。

[code that decides $table]
foreach ($_POST[$lastvar] as $key => $value) {
 [code not relevant to Q]
 $sql3 = "SELECT * from $table WHERE titlesid=? and peopleid=?";
 $stmt3 = $mysqli->prepare($sql3);
 $stmt3->bind_param("ii", $titlesid,$peopleid);
 $stmt3->execute();
if ($stmt3->num_rows == 0) {
  if ($table == "dhereviewers") {
  $sql = "INSERT into $table (titlesid,peopleid) VALUES (?,?)";
  } else {
  $sql = "INSERT into $table (titlesid,peopleid,billing) VALUES (?,?,?)";
  }
$billing++;
[prepare/execute one of the last two statements]
 } 
 }
 } 

因此,根据“如果”,我将执行最后两个插入中的一个或另一个。因为它们是有条件的,我是否只在它们被“选择”时才准备它们?

希望我很清楚。 :-)

仍在学习准备好的语句。

【问题讨论】:

    标签: php mysqli prepared-statement


    【解决方案1】:

    您可以像您建议的那样有条件地确定您准备好的陈述。这里没有问题。唯一的问题是,在您的情况下,您需要了解选择了哪个选项,以便知道要绑定多少个参数。

    话虽如此,查看您的代码,您可能会考虑执行这样的 INSERT .. SELECT 查询:

    INSERT INTO table_1 (field_1, field_2)
    SELECT field_1, field_2 FROM table_2
    WHERE field_x = ?
    

    所以您不需要在一个循环中执行一大堆不同的查询。您应该能够通过一个查询来做您想做的事情。

    在此处查看有关 INSERT .. SELECT 语法的 MySQL 文档:http://dev.mysql.com/doc/refman/5.5/en/insert-select.html

    【讨论】:

    • 谢谢...我会调查的。想知道它是否会起作用,因为选项 1 有两个字段,选项 2 有 3 个。
    • @Ian 当然,您只需根据表格确定是否需要进行三字段插入或两字段插入。这个决定应该与你目前所做的没有什么不同。
    【解决方案2】:

    由于两个语句的参数数量不同,因此在 if/then/else 块中进行准备和绑定可能会更清楚。

    if ($table == "dhereviewers") {
      $sql = "INSERT into $table (titlesid,peopleid) VALUES (?,?)";
      if ($stmt = $mysqli->prepare($sql)) {
        $stmt->bind_param("ii", $titlesid, $peopleid);
      }
    } else {
      $sql = "INSERT into $table (titlesid,peopleid,billing) VALUES (?,?,?)";
      if ($stmt = $mysqli->prepare($sql)) {
        $stmt->bind_param("iii", $titlesid, $peopleid, $billing);
      }
    }
    $stmt->execute();
    

    @MikeBrant 有一个很好的观点,在这个例子中,你可以更简单地做到这一点。但这可能取决于您为此问题排除的一些代码。

    PS:num_rows 总是报告零行,直到您获取所有行。您可以使用 fetch() 或使用 $mysqli->store_result() 来执行此操作。见http://www.php.net/manual/en/mysqli-stmt.num-rows.php

    【讨论】:

    • 感谢 num_rows 的提醒。仍然围绕着新方法。
    • @Ian,num_rows 的行为与 mysql_num_rows() 完全相同——它只适用于缓冲查询。
    • 是的,抱歉……我现在遇到的更大问题是“命令不同步”。试图找出如何解决这个问题。
    • 感谢您的指点。还得多读书。现在,尽管有绑定的结果,我什至似乎都无法获得价值,所以我可能在我眼皮子底下做错了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多