【问题标题】:How to get all values out of the prepared statement query result如何从准备好的语句查询结果中获取所有值
【发布时间】:2012-09-05 16:58:20
【问题描述】:

我有下一个代码,用于创建 mysqli 对象并准备查询:

    $GLOBALS['DB_something'] = new mysqli('$database_hostname','$database_username','$database_password','$database_default');
    $GLOBALS['DB_prepared_get'] = $GLOBALS['DB_something']->prepare("SELECT ? from database_name WHERE hash=?");

和下一个代码,获取并显示结果。由于我最近没有进入准备好的语句,特别是没有使用 PHP,我不知道如何从中得到结果。
当我在没有准备好的语句的情况下编写代码时,它可以工作,但由于很多原因,我需要用准备好的语句重写它。

$GLOBALS['DB_prepared_get']->bind_param('ss', $arg, $index);
$GLOBALS['DB_prepared_get']->execute();
$GLOBALS['DB_prepared_get']->bind_result($result); # this is an array of values 

$GLOBALS['DB_prepared_get']->fetch();       
            # below this, I don't know if it's ok               
            if(mysql_num_rows($result) == 0){
                return "0";
            }

            else{
                while($GLOBALS['DB_prepared_get']->fetch()) {
                    return $result;
                }
            }

            $GLOBALS['DB_prepared_get']->close();

感谢您的帮助。

编辑:为了清楚起见,我的问题是如何获取确切的结果值以将它们打印出来或其他东西。所以语法是我可能做错的。

【问题讨论】:

  • 选择是什么,准备好的语句不适用于第一个?参数如果我没记错的话,你必须明确地写出来
  • 准备好声明的意义何在? :(
  • 安全有时是性能,您将更改的值是 SELECT * FROM table WHERE id=? ,而您使用 ?对于倍数 ID

标签: php mysqli prepared-statement


【解决方案1】:

据我所知,您不能将查询的列指定为参数。您必须直接在准备好的语句字符串中写入列。

类似

$GLOBALS['DB_prepared_get'] = $GLOBALS['DB_something']->prepare("SELECT a,b,c from database_name WHERE hash=?");

【讨论】:

  • 在准备好的语句中有直接列,我的“准备好的声明”不再有用了,是吗?
  • 准备好的语句的想法是验证和清理输入参数(除其他外)。它非常有用。
  • 最重要的是查询只准备好一次。稍后,仅更改参数。这就是为什么我需要稍后用 bindParam 更改 SELECT X this X。
【解决方案2】:

您的代码中有很多错误,我什至没有尝试解释它有什么问题。不过我可以说,如果你没有 OO 编程经验,你首先应该尝试用 mysqli 编写程序代码。

这段代码应该可以工作:

  $mysqli = new mysqli( $database_hostname, $database_username, $database_password, $database_default );
  if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '  . $mysqli->connect_error);

  if ($stmt = $mysqli->prepare("SELECT ? from database_name WHERE hash=?")) {
    $stmt->bind_param("s", $fieldname); // first marker
    $stmt->bind_param("s", $hashwhere); // second marker

    $stmt->execute();

    $result = array();
    while ($stmt->fetch()) {
      $result[] = array($fieldname);
    }

    $stmt->close();
  }

  $mysqli->close();

  var_dump($result);

【讨论】:

  • 这也不行。但是我使用 $GLOBALS 来放入 $stmt,因为这是我的情况,不使用它就无法做到。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2016-09-11
  • 1970-01-01
  • 2015-10-29
  • 2017-03-26
  • 1970-01-01
  • 2019-03-05
  • 2011-01-15
相关资源
最近更新 更多