<i id='EUWhs'><tr id='EUWhs'><dt id='EUWhs'><q id='EUWhs'><span id='EUWhs'><b id='EUWhs'><form id='EUWhs'><ins id='EUWhs'></ins><ul id='EUWhs'></ul><sub id='EUWhs'></sub></form><legend id='EUWhs'></legend><bdo id='EUWhs'><pre id='EUWhs'><center id='EUWhs'></center></pre></bdo></b><th id='EUWhs'></th></span></q></dt></tr></i><div id='EUWhs'><tfoot id='EUWhs'></tfoot><dl id='EUWhs'><fieldset id='EUWhs'></fieldset></dl></div>
    • <bdo id='EUWhs'></bdo><ul id='EUWhs'></ul>
  • <legend id='EUWhs'><style id='EUWhs'><dir id='EUWhs'><q id='EUWhs'></q></dir></style></legend>

    <small id='EUWhs'></small><noframes id='EUWhs'>

  • <tfoot id='EUWhs'></tfoot>

      1. mySQLi 准备好的语句无法 get_result()

        时间:2023-07-31
          <tbody id='iCIGb'></tbody>
        <legend id='iCIGb'><style id='iCIGb'><dir id='iCIGb'><q id='iCIGb'></q></dir></style></legend>

              • <small id='iCIGb'></small><noframes id='iCIGb'>

              • <i id='iCIGb'><tr id='iCIGb'><dt id='iCIGb'><q id='iCIGb'><span id='iCIGb'><b id='iCIGb'><form id='iCIGb'><ins id='iCIGb'></ins><ul id='iCIGb'></ul><sub id='iCIGb'></sub></form><legend id='iCIGb'></legend><bdo id='iCIGb'><pre id='iCIGb'><center id='iCIGb'></center></pre></bdo></b><th id='iCIGb'></th></span></q></dt></tr></i><div id='iCIGb'><tfoot id='iCIGb'></tfoot><dl id='iCIGb'><fieldset id='iCIGb'></fieldset></dl></div>
                  <bdo id='iCIGb'></bdo><ul id='iCIGb'></ul>

                • <tfoot id='iCIGb'></tfoot>
                  本文介绍了mySQLi 准备好的语句无法 get_result()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我完全被 mySQLi 弄糊涂了.尽管我多年来一直在使用过程 mysql 调用,但我想习惯于为它提供的 db security/mySQL 注入保护制作准备好的语句.我正在尝试编写一个简单的选择语句(是的,我知道为此进行程序调用可提供性能增强).运行时,我得到所有回声,直到我点击 $result = $stmt->get_result(); 组件.这一切对我来说似乎相当简单,但在阅读了有关 mySQLi 的手册数小时后,我不知所措.任何想法为什么会失败?

                  I am totally confused by mySQLi. Although I have been using procedural mysql calls for years, I want to get used to making prepared statements for the db security/mySQL injection protection it offers. I am trying to write a simple select statement (yes I know making a procedural call for this offers performance enhancement). When run, I get all the echoes until I hit the $result = $stmt->get_result(); component. It all seems fairly straightforward to me, but I am at a loss after hours of reading manuals on mySQLi. Any ideas why this would be failing?

                  *注意:这是一个测试环境,虽然没有进行字符清理/转义,但我只是将有效内容传递到变量 $username 和 $email 中.而且,我已经查看了所有内容以找到我的问题的解决方案.

                  *note: this is a test environment and while no sanitizing/escaping of characters is taking place, I am only passing valid content into the variables $username and $email. And also, I have looked all over SO to find the solution to my issue.

                  function checkUsernameEmailAvailability($username, $email) {
                      //Instantiate mysqli connection
                      @$mysqli = new mysqli(C_HOST,C_USER,C_PASS,C_BASE) or die("Failed to connect to MySQL database...");
                      if (!$mysqli)
                      {
                          echo 'Error: Could not connect to database.  Please try again later...';
                          exit;
                      } else {
                          echo 'mysqli created';
                      }
                  
                      /* Create a prepared statement */   
                      if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
                          echo '<br />MYSQLi: ';
                  
                          /* Bind parameters s - string, b - boolean, i - int, etc */
                          $stmt -> bind_param("ss", $username, $email);
                          echo '<br />paramsBound...';
                  
                          /* Execute it */
                          $stmt -> execute();     
                          echo '<br />Executed';
                  
                          $result = $stmt->get_result();
                          echo '<br />Result acquired';
                  
                          /* now you can fetch the results into an array - NICE */
                          $myrow = $result->fetch_assoc();
                          echo '<br />Fetched';
                  
                  
                          /* Close statement */
                          /$stmt -> close();
                          echo '<br />Done mysqli';
                      }
                  }    
                  

                  另外,每次调用函数时都必须实例化一个 mysqli 吗?我假设它们不是像程序 mysql 中那样的持久数据库连接.是的,我知道这是一个范围问题,不,我无法理解此类变量的范围.我在函数外声明的时候,进入函数时不可用.

                  Also, do I have to instantiate a mysqli every time I call a function? I'm assuming they're not persistent db connects like in procedural mysql. Yes, I am aware this is a scope issue, and no I have not been able to understand the scoping of this class variable. When I declared it outside of the function, it was not available when I came into the function.

                  更新如果我将第 12 行更改为:

                  UPDATE if I change line 12 from:

                  if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
                  

                  到:

                      $stmt = $mysqli->stmt_init();
                      if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
                          if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
                  

                  我没有准备好声明.现在我更糊涂了....

                  I get Statement NOT prepared. Now I'm even more confused....

                  更新:我联系了我的托管服务提供商,显然支持 mySQLi,并且存在 mysqlnd 驱动程序.也许有一种方法可以简单地测试这个?尽管过去他们通常会给我非常有见地的答案.

                  UPDATE: I contacted my hosting provider and apparently mySQLi is supported, and the mysqlnd driver is present. Perhaps there is a way to simply test this? Although they usually have given me pretty knowledgeable answers in the past.

                  更新...再次:我自己检查了我的服务器功能并发现,虽然存在 mysqli 和 PDO,但 mysqlnd 不存在.因此,我明白为什么 get_result() 不起作用(我认为需要 mysqlnd),我仍然不明白为什么准备好的语句本身不起作用.

                  UPDATE...AGAIN: I checked my server capabilities myself and discovered, while mysqli and PDO are present, mysqlnd is not. Thusly, I understand why get_result() will not work (mysqlnd required I think), I still don't understand why the prepared statement itself will not work.

                  推荐答案

                  通过一些检查,尽管我的主机上安装了 mysqli,但显然 mysqlnd 驱动程序不存在.因此,无法使用 get_result()(php 手册将 get_result 定义为依赖于 mysqlnd),而是需要进行额外的编码以按照我想要的方式处理我的结果.

                  Through some checking, even though mysqli is installed on my host, apparently the mysqlnd driver is not present. Therefore, get_result() can not be used(php manual defines get_result as mysqlnd dependent), and instead extra coding would need to be done to handle my result the way I would like.

                  因此,我决定尝试了解 PDO 的工作原理,几分钟之内,瞧!!!

                  Therefore, I decided to try and learn how PDO works, and within minutes, voila!!!

                  用这个替换上面的代码:

                  Replaced the above code with this:

                  function checkUsernameEmailAvailability($username, $email) {
                  
                  echo 'pdo about to be created';
                  
                  $dsn = 'mysql:dbname='.C_BASE.';host='.C_HOST;
                  $user = C_USER;
                  $password = C_PASS;
                  
                  try {
                      $dbh = new PDO($dsn, $user, $password);
                  } catch (PDOException $e) {
                      echo 'Connection failed: ' . $e->getMessage();
                  }
                  
                  $params = array(':username' => $username, ':email' => $email);
                  
                  try{
                  $sth = $dbh->prepare('SELECT username,email FROM tb_users WHERE username = :username OR email = :email ');
                  } catch(PDOException $e) {
                      echo 'Prepare failed: ' . $e->getMessage();
                  }
                  
                  try{
                  $sth->execute($params);
                  } catch(PDOException $e) {
                      echo 'Execute failed: ' . $e->getMessage();
                  }
                  $result = $sth->fetch(PDO::FETCH_ASSOC);
                  print_r($result);
                  }
                  

                  我能想到的尽可能多的错误检查,首先破解它根本没有问题!

                  As much error checking as I could think of, and no problems at all first crack at it!

                  最终代码

                  function checkUsernameEmailAvailability($username, $email) {
                      $dsn = 'mysql:dbname='.C_BASE.';host='.C_HOST;
                      $user = C_USER;
                      $password = C_PASS;
                      new PDO($dsn, $user, $password);
                  
                      $params = array(':username' => $username, ':email' => $email);
                  
                      $sth = $dbh->prepare('SELECT username,email FROM tb_users WHERE username = :username OR email = :email ');
                      $sth->execute($params);
                      $result = $sth->fetch(PDO::FETCH_ASSOC);
                  
                      print_r($result);
                  }
                  

                  这篇关于mySQLi 准备好的语句无法 get_result()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:在准备好的语句中使用通配符 - MySQLi 下一篇:MySQLi 准备语句与 IN 运算符

                  相关文章

                  最新文章

                  1. <legend id='TfAXT'><style id='TfAXT'><dir id='TfAXT'><q id='TfAXT'></q></dir></style></legend>

                    <small id='TfAXT'></small><noframes id='TfAXT'>

                    <tfoot id='TfAXT'></tfoot>
                    • <bdo id='TfAXT'></bdo><ul id='TfAXT'></ul>
                    <i id='TfAXT'><tr id='TfAXT'><dt id='TfAXT'><q id='TfAXT'><span id='TfAXT'><b id='TfAXT'><form id='TfAXT'><ins id='TfAXT'></ins><ul id='TfAXT'></ul><sub id='TfAXT'></sub></form><legend id='TfAXT'></legend><bdo id='TfAXT'><pre id='TfAXT'><center id='TfAXT'></center></pre></bdo></b><th id='TfAXT'></th></span></q></dt></tr></i><div id='TfAXT'><tfoot id='TfAXT'></tfoot><dl id='TfAXT'><fieldset id='TfAXT'></fieldset></dl></div>