【问题标题】:Prepared statement doesn't fetches data准备好的语句不获取数据
【发布时间】:2017-09-01 14:38:28
【问题描述】:
$id = $_REQUEST['id'];

$stmt = $conn->prepare('SELECT * FROM test WHERE id = ?');
echo $id;
$stmt->bind_param('s', $id);

$stmt->execute();

// This is line 12
while ($row = $stmt->fetch()) {
    $test = $row['test'];
}

好的,我们开始吧。这段代码不起作用,因为我基本上收到一个错误,告诉我关注

#0 /example/example.php(2): require()
#1 {main}
  thrown in /example/example.inc.php on line 12

我不知道我做错了什么,但我已经尝试过bind_result()$stmt->fetch_assoc(),它们也不起作用。我在这里阅读了很多其他问题,但它们对我没有帮助。

这是连接

<?
$servername = "exase";
$username = "exaus";
$password = "exapw";
$dbname = "exa_db";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

【问题讨论】:

  • 你的连接是什么样的?
  • 实际的错误信息是什么? (该堆栈跟踪上方的行)
  • 您应该将参数绑定为 int,而不是字符串。 $stmt-&gt;bind_param('i', $id); 不确定这是否能解决您的问题,但您目前做得不好。
  • Jay waot O cam ad 连接,但我还有其他几个脚本,一切正常
  • GrumpyCrouton 你回答了我关于 switch 语句的最后一个问题:D 不,id 不是一个数字,它只包含字母

标签: php mysql mysqli prepared-statement


【解决方案1】:

使用 MySQLi 准备好的语句时,它与使用标准查询略有不同。您需要使用mysqli_stmt::bind_result(),或使用mysqli_stmt::get_result() 存储结果集,然后才能在获取结果时使用数据。请注意,在使用 get_result() 之前,您需要 MySQL 原生驱动程序 mysqlnd - 否则您需要使用 bind_result() 手动绑定每一列。

这是一个如何使用bind_result() 的示例。请注意,您需要绑定与查询中一样多的列,并且由于您执行SELECT *,因此您需要绑定表中的所有内容 - 但是,如果您这样做,该方法将失败稍后在您的表格中添加一列。因此最好只选择您需要的列,例如SELECT id, test FROM..

$id = $_REQUEST['id'];

$stmt = $conn->prepare('SELECT test, id FROM test WHERE id = ?');
$stmt->bind_param('s', $id);

$stmt->execute();
$stmt->bind_result($test, $result_id);
$stmt->fetch()); 

/*
* If there was any matching rows, the variables defined in bind_param()
* now hold the values
* You can then use '$test' and '$result_id'
*/
echo $test;

$stmt->close();

如果您安装了 MySQL 原生驱动程序,则可以使用 get_result() 并将其用作“常规”查询。那么,如果您选择SELECT *,那么这并不重要(尽管我不建议您选择所有内容 - 您应该选择您需要的列,仅此而已)。

$id = $_REQUEST['id'];

$stmt = $conn->prepare('SELECT * FROM test WHERE id = ?');
$stmt->bind_param('s', $id);

$stmt->execute();
$result = $stmt->get_result(); // $result is now an object of MySQLi resource, and not MySQLi statement
                               // It can now be used as as the result-set of a regular query

$row = $result->fetch_assoc());
$test = $row['test'];
echo $test;

$stmt->close();

【讨论】:

  • 我不明白的一件事是,如果已经在 bind_result 中得到结果,为什么我还要花一些时间,或者不是这样吗?
  • 因为这只会绑定每次调用 fetch() 的结果(如果您有多行)。在您获取它之前,它们不包含该值。如果您只有一行与该 ID 匹配,则可以删除 while,但您仍需要在 bind_result() 中定义的变量保存数据库中的任何值之前将其 fetch()
  • id 列有一个主键,所以它是唯一的,但是我怎样才能获取它呢?
  • 如果它是唯一的,您可以删除while,但您仍然需要先获取才能使用变量。
  • 但我的意思是如何获取它们?我应该将变量放入 fetch 吗?比如 $stmt->fetch($test1, $test2);
【解决方案2】:

你没有正确地做准备好的陈述,看这个:

 $id = $_REQUEST['id'];

    $stmt = $conn->prepare('SELECT col1,col2,col3 FROM test WHERE id = ?');
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $stmt->bind_result($col1,$col2,$col3);  // you need to bind the result when using prepared statements
    $stmt->store_result();  // store it so if the number of rows retrieved is large they won't be dropped during loop or cause the overload error


    while ($stmt->fetch()) {
        $test = $col1;
         echo $col2;
    }

$stmt->close();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多