准备好的语句不获取数据

Posted

技术标签:

【中文标题】准备好的语句不获取数据【英文标题】: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 不是一个数字,它只包含字母 【参考方案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();
PHP.net on mysqli_stmt::get_result() PHP.net on mysqli_stmt::bind_result()

【讨论】:

我不明白的一件事是,如果已经在 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();

【讨论】:

我需要所有列 选择*有什么问题? 相关***.com/questions/321299/… ***.com/questions/487578/… ***.com/questions/262450/… - 谢谢@clearshot66 我不知道这个:) 我猜你可以,但这不是典型的,你仍然需要 bind_result,你在使用 $stmt->fetch 时不要使用 $row 关联数组

以上是关于准备好的语句不获取数据的主要内容,如果未能解决你的问题,请参考以下文章

通过准备好的语句从数据库中获取行

无法使用准备好的对象语句从 mysql 获取多行数据 [重复]

如何在for循环中执行准备好的语句以从jsp中的表中获取数据?

cakePHP 准备好的语句不工作(获取所有不工作)

如何确定从我的 html 表单获取的输入值的数据类型,以便我可以使用它们在准备好的语句中绑定参数

为啥 JDBC 不支持批量获取数据?