这是我的密码:
include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();
最后一行的错误是:调用未定义的方法mysqli\u stmt::get\u result()
下面是conn.php的代码:
define('SERVER', 'localhost');
define('USER', 'root');
define('PASS', 'xxxx');
define('DB', 'xxxx');
class Connection{
/**
* @var Resource
*/
var $mysqli = null;
function __construct(){
try{
if(!$this->mysqli){
$this->mysqli = new MySQLi(SERVER, USER, PASS, DB);
if(!$this->mysqli)
throw new Exception('Could not create connection using MySQLi', 'NO_CONNECTION');
}
}
catch(Exception $ex){
echo "ERROR: ".$e->getMessage();
}
}
}
如果我写这行:
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
它打印“未准备好的声明”。如果我直接在ide中运行查询?有价值的标记,效果很好。请注意,$conn object在项目中的其他查询中工作正常。
有什么需要帮忙的吗。。。。。。。
10条答案
按热度按时间mnowg1ta1#
我意识到在这个问题上已经有一段时间没有任何新的活动了。但是,正如其他海报所评论的那样-
get_result()
现在只能通过安装mysql本机驱动程序(mysqlnd)在php中使用,在某些情况下,安装mysqlnd可能是不可能的,或者是不可取的。所以,我认为这将是有帮助的信息后,如何获得这个功能的答案get_result()
优惠-不使用get_result()
.get_result()
经常与fetch_array()
循环遍历结果集并将结果集每行的值存储在数字索引或关联数组中。例如,下面的代码使用get_result()和fetch_array()循环遍历结果集,将数值索引$data[]数组中每一行的值存储起来:但是,如果
get_result()
不可用(因为没有安装mysqlnd),则会导致如何将结果集的每一行中的值存储在数组中而不使用get_result()
. 或者,如何迁移使用get_result()
不用它运行(例如使用bind_result()
相反),同时尽可能少地影响代码的其余部分。结果表明,将每一行的值存储在一个数字索引数组中并不是那么直接地使用
bind_result()
.bind_result()
需要标量变量列表(不是数组)。因此,要使它将结果集的每一行中的值存储在一个数组中需要做一些工作。当然,代码可以很容易地修改如下:
但是,这要求我们在调用中分别显式列出$data[0]、$data[1]等
bind_result()
,这并不理想。我们需要的解决方案不需要显式列出$data[0],$data[1]$调用中的数据[n-1](其中n是select语句中的字段数)bind_results()
. 如果我们要迁移一个具有大量查询的遗留应用程序,并且每个查询在select
如果我们使用上述解决方案,迁移将是非常劳动密集型的,并且容易出错。理想情况下,我们需要一段“drop-in-replacement”代码—只替换包含
get_result()
函数和下一行的while()循环。替换代码应该与它要替换的代码具有相同的功能,而不影响前面的任何行或后面的任何行-包括while()循环中的行。理想情况下,我们希望替换代码尽可能紧凑,并且不希望必须根据select
查询的子句。在互联网上搜索,我发现了许多使用
bind_param()
与call_user_func_array()
(例如,动态绑定mysqli\u stmt参数,然后绑定结果(php)),但我发现的大多数解决方案最终导致结果存储在关联数组中,而不是数字索引数组中,并且这些解决方案中的许多都没有我想要的那么紧凑,并且/或者不适合作为“插入式替换”。然而,从我发现的例子来看,我能够拼凑出这个解决方案,这符合要求:当然,for()循环可以折叠成一行,使其更加紧凑。
我希望这有助于任何人谁是寻找一个解决方案使用
bind_result()
将每一行的值存储在数字索引数组中,和/或寻找使用get_result()
. 欢迎评论。xfb7svmp2#
你的系统缺少mysqlnd驱动程序!
如果您能够在(基于debian/ubuntu的)服务器上安装新软件包,请安装驱动程序:
然后重新启动web服务器:
9vw9lbht3#
我知道这已经回答了什么是实际问题,但我想提供一个简单的解决办法。
我想使用get\u results()方法,但是我没有驱动程序,而且我也没有地方可以添加驱动程序。所以,在我打电话之前
我创建了一个空数组,然后将结果绑定为该数组中的键:
因此,这些结果可以很容易地传递到方法或转换到对象以供进一步使用。
希望这能帮助任何想做类似事情的人。
gmxoilav4#
在phpversion7.2中,我只使用了nd\umysqli而不是mysqli,并且工作正常。
将其启用到godaddy宿主服务器的步骤-
登录到cpanel。
点击“选择php版本”。
根据提供的最新配置快照,取消选中“mysqli”并启用“nd\u mysqli”。
31moq8wy5#
我在我的服务器上也遇到了同样的错误——PHP7.0已经启用了mysqlnd扩展。
我的解决方案是(感谢这个页面)取消选择mysqli扩展并选择nd\u mysqli。
注意-您可以访问cpanel中的扩展选择器(我通过select php version选项访问我的
b1zrtrql6#
我编写了两个简单的函数,它们提供了与
$stmt->get_result();
,但它们不需要mysqlnd驱动程序。你只需替换
$result = $stmt->get_result();
具有$fields = bindAll($stmt);
和$row= $stmt->get_result();
具有$row = fetchRowAssoc($stmt, $fields);
.(要获取返回的行数,可以使用
$stmt->num_rows
.)您只需将我编写的这两个函数放在php脚本的某个地方(例如右下角)
工作原理:
我的代码使用
$stmt->result_metadata();
函数来确定返回了多少字段和哪些字段,然后自动将获取的结果绑定到预先创建的引用。很有魅力!2fjabf4q7#
请阅读此方法的用户说明:
http://php.net/manual/en/mysqli-stmt.get-result.php
它需要mysqlnd驱动程序。。。如果它没有安装在您的网站空间,您将不得不与bind\u result&fetch!
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
a8jjtwal8#
对于那些正在寻找
$result = $stmt->get_result()
我做了这个函数,可以让你模拟$result->fetch_assoc()
但是直接使用stmt对象:如您所见,它创建了一个数组并用行数据获取它,因为它使用
$stmt->fetch()
在内部,您可以像调用mysqli_result::fetch_assoc
(只需确保$stmt
对象已打开,结果已存储):vaqhlq819#
这是我的选择。它是面向对象的,更像mysql/mysqli。
用法:
thtygnil10#
因此,如果mysql本机驱动程序(mysqlnd)不可用,因此使用bind\u result and fetch而不是get\u result,代码将变为: