Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQLi中选择*FROM_Php_Mysqli - Fatal编程技术网

Php 在MySQLi中选择*FROM

Php 在MySQLi中选择*FROM,php,mysqli,Php,Mysqli,我的网站相当广泛,我最近刚切换到PHP5(叫我晚熟) 我之前的所有MySQL查询都是这样构建的: "SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'"; 这使它变得非常容易、简单和友好 出于明显的安全原因,我现在正试图切换到mysqli,我很难弄清楚当bind_参数需要特定参数时,如何实现相同的SELECT*FROM查询 这句话已经过时了吗 如果是,我如何处理涉及大量列的查询?我真的需要每次都

我的网站相当广泛,我最近刚切换到PHP5(叫我晚熟)

我之前的所有MySQL查询都是这样构建的:

"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";
这使它变得非常容易、简单和友好

出于明显的安全原因,我现在正试图切换到mysqli,我很难弄清楚当
bind_参数
需要特定参数时,如何实现相同的
SELECT*FROM
查询

这句话已经过时了吗

如果是,我如何处理涉及大量列的查询?我真的需要每次都把它们打出来吗

这句话已经过时了吗

对。不要使用
选择*
;这是一场维护噩梦。关于为什么这个构造不好,以及避免它将如何帮助您编写更好的查询,还有很多其他的线程

另见:

    • 您仍然可以使用它(mysqli只是与服务器通信的另一种方式,SQL语言本身是扩展的,而不是更改的)。但是更安全——因为你不需要每次都正确地逃避你的价值观。如果愿意,您可以让它们保持原样,但如果您切换,sql搭载的风险会降低

      "SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";
      
      变成

      "SELECT * FROM tablename WHERE field1 = ? && field2 = ?";
      
      它被传递到
      $mysqli::prepare

      $stmt = $mysqli->prepare(
        "SELECT * FROM tablename WHERE field1 = ? && field2 = ?");
      $stmt->bind_param( "ss", $value, $value2); 
      // "ss' is a format string, each "s" means string
      $stmt->execute();
      
      $stmt->bind_result($col1, $col2);
      // then fetch and close the statement
      
      OP评论:


      因此,如果我有5个参数,我可能有“sssis”之类的(取决于输入的类型?)

      右,在准备好的语句中,每个
      参数有一个类型说明符,所有类型说明符都是位置的(第一个说明符应用于第一个
      ,第一个实际参数替换为第一个实际参数(这是
      绑定参数
      的第二个参数)


      mysqli将负责转义和引用(我想)

      切换时,请切换到PDO而不是mysqli,它可以帮助您编写与数据库无关的代码,并为准备好的语句提供更好的功能

      PDO的Bindparam:

      或:

      或将参数作为数组执行:

      $sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = :value1 && field2 = :value2");
      $sth->execute(array(':value1' => 'foo' , ':value2' => 'bar'));
      
      如果您希望您的应用程序将来能够在不同的数据库上运行,那么这将更容易


      我还认为,在与PDO合作时,您应该投入一些时间使用Zend Framwork的一些课程。查看他们的产品,更具体地说是[Zend_Db_Factory][2]。您不必使用所有的框架或将应用程序转换为MVC模式,但使用框架并阅读它是一段很好的时间。

      这已经是一个月前的事了,但是很好

      我可能是错的,但是对于你的问题,我觉得
      bind_param
      并不是这里真正的问题。您总是需要定义一些条件,可以直接在查询字符串本身中使用
      bind_param
      来设置
      占位符。这不是一个真正的问题

      我在使用MySQLi
      SELECT*
      查询时遇到的问题是
      bind\u结果部分。这就是它变得有趣的地方。我从Jeffrey Way那里看到了这篇文章:(这个链接不再活跃)。该脚本基本上循环遍历结果并将其作为数组返回——不需要知道有多少列,而且您仍然可以使用准备好的语句

      在这种情况下,它看起来像这样:

      $stmt = $mysqli->prepare(
        'SELECT * FROM tablename WHERE field1 = ? AND field2 = ?');
      $stmt->bind_param('ss', $value, $value2);
      $stmt->execute();
      然后使用站点中的代码段:

      $meta = $stmt->result_metadata();
      
      while ($field = $meta->fetch_field()) {
        $parameters[] = &$row[$field->name];
      }
      
      call_user_func_array(array($stmt, 'bind_result'), $parameters);
      
      while ($stmt->fetch()) {
        foreach($row as $key => $val) {
          $x[$key] = $val;
        }
        $results[] = $x;
      }

      $results
      现在包含
      SELECT*
      中的所有信息。到目前为止,我发现这是一个理想的解决方案。

      我正在寻找一个好的、完整的示例,说明如何将多个查询参数动态绑定到任何SELECT、INSERT、UPDATE和DELETE查询。在他的回答中提到了一种如何绑定结果的方法,对我来说,用于选择查询的get_result()after execute()函数工作得很好,我能够将所有选择的结果检索到一个关联数组中

      无论如何,我最终创建了一个函数,在这个函数中,我可以将任意数量的参数动态绑定到参数化查询(使用call_user_func_数组函数),并获得查询执行的结果。下面是函数及其文档(使用前请先阅读,尤其是参数需要理解)

      用法:

          $param1 = "128989";
          $param2 = "some passcode";
      
      
          $insertQuery = "INSERT INTO Cards (Serial, UserPin) VALUES (?, ?)";
          $rowsInserted = ExecuteMySQLParametrizedQuery($dbConnection, $insertQuery, TRUE, 'ss', $errorOut, array(&$param1, &$param2) ); // Make sure the parameters in an array are passed by reference
      
          if ($rowsInserted === NULL)
              echo 'error ' . $errorOut;
          else
              echo "successfully inserted row";
      
      
          $selectQuery = "SELECT CardID FROM Cards WHERE Serial like ? AND UserPin like ?";
          $arrayOfCardIDs = ExecuteMySQLParametrizedQuery($dbConnection, $selectQuery, FALSE, 'ss', $errorOut, array(&$param1, &$param2) ); // Make sure the parameters in an array are passed by reference
      
          if ($arrayOfCardIDs === NULL) 
              echo 'error ' . $errorOut;
          else
          {
              echo 'obtained result array of ' . count($arrayOfCardIDs) . 'selected rows';
      
              if (count($arrayOfCardIDs) > 0) 
                  echo 'obtained card id = ' . $arrayOfCardIDs[0]['CardID'];
          }
      

      您可以对语句使用
      get\u result()


      有时你甚至需要旧用法。例如,Mysql不能在一个准备好的语句中进行多次插入。它不能吗?这不是大多数人需要做的事情吗?不,它不能像插入A(A,b)值(1,2)、(3,4)、(5,6)那样做。如果(而且只有)速度是一个问题(不应该在99%的情况下——但我们只是在最近的项目中有一个),考虑一下:准备好的语句需要3个通信来进行1个查询(准备,设置var,执行)……我完全相信你,但是我在某种程度上找到了它们,我可以从他们那里学习。你能给我一个链接吗?谢谢:)我想问题是关于绑定变量的。我认为“SELECT*(如果您需要的不仅仅是主键或其他索引列)没有什么大问题。是的,搜索引擎不太喜欢查询“SELECT*”;我用几个链接编辑了我的文章(第一个链接特别有用)。因此,如果我有5个参数,我可能会有“sssis”或什么(取决于输入的类型?)太棒了,我从来没有听说过PDO,我会检查它的外部错误消息,因为函数参数只是一个奇怪的事情。错误应该是错误$isDMQ和$paremetersTypes应该是可选的。感谢您的评论-编辑后使用fetch_all()函数。我知道这个实现并不完美,请根据您的需要自由编辑函数。就可选参数而言——正如函数名所示,其目的是仅执行参数化查询(无需将此函数用于非参数化查询)。太棒了,谢谢@Alec!一个小小的补充,我自己挣扎着说:如果你也想
      $meta = $stmt->result_metadata();
      
      while ($field = $meta->fetch_field()) {
        $parameters[] = &$row[$field->name];
      }
      
      call_user_func_array(array($stmt, 'bind_result'), $parameters);
      
      while ($stmt->fetch()) {
        foreach($row as $key => $val) {
          $x[$key] = $val;
        }
        $results[] = $x;
      }
           /**
           * Prepares and executes a parametrized QUERY (SELECT, INSERT, UPDATE, DELETE)
           *
           * @param[in] $dbConnection mysqli database connection to be used for query execution
           * @param[in] $dbQuery parametrized query to be bind parameters for and then execute
           * @param[in] $isDMQ boolean value, should be set to TRUE for (DELETE, INSERT, UPDATE - Data manipulaiton queries), FALSE for SELECT queries
           * @param[in] $paremetersTypes String representation for input parametrs' types as per http://php.net/manual/en/mysqli-stmt.bind-param.php
           * @param[in] $errorOut A variable to be passed by reference where a string representation of an error will be present if a FAUILURE occurs
           * @param[in] $arrayOfParemetersToBind Parameters to be bind to the parametrized query, parameters need to be specified in an array in the correct order 
           * @return array of feched records associative arrays for SELECT query on SUCCESS, TRUE for INSERT, UPDATE, DELETE queries on SUCCESS, on FAIL sets the error and returns NULL 
           */
          function ExecuteMySQLParametrizedQuery($dbConnection, $dbQuery, $isDMQ, $paremetersTypes, &$errorOut, $arrayOfParemetersToBind)
          {
              $stmt = $dbConnection->prepare($dbQuery);
      
              $outValue = NULL;
      
              if ($stmt === FALSE)
                  $errorOut = 'Failed to prepare statement for query: ' . $dbQuery;
              else if ( call_user_func_array(array($stmt, "bind_param"), array_merge(array($paremetersTypes), $arrayOfParemetersToBind)) === FALSE)
                  $errorOut = 'Failed to bind required parameters to query: ' . $dbQuery . '  , parameters :' . json_encode($arrayOfParemetersToBind);
              else if (!$stmt->execute())
                  $errorOut = "Failed to execute query [$dbQuery] , erorr:" . $stmt->error;
              else
              {
                  if ($isDMQ)
                     $outValue = TRUE;
                  else
                  {
                      $result = $stmt->get_result();
      
                      if ($result === FALSE) 
                           $errorOut = 'Failed to obtain result from statement for query ' . $dbQuery;
                      else
                          $outValue = $result->fetch_all(MYSQLI_ASSOC);
                  }
              }
      
              $stmt->close();
      
              return $outValue;
          }
      
          $param1 = "128989";
          $param2 = "some passcode";
      
      
          $insertQuery = "INSERT INTO Cards (Serial, UserPin) VALUES (?, ?)";
          $rowsInserted = ExecuteMySQLParametrizedQuery($dbConnection, $insertQuery, TRUE, 'ss', $errorOut, array(&$param1, &$param2) ); // Make sure the parameters in an array are passed by reference
      
          if ($rowsInserted === NULL)
              echo 'error ' . $errorOut;
          else
              echo "successfully inserted row";
      
      
          $selectQuery = "SELECT CardID FROM Cards WHERE Serial like ? AND UserPin like ?";
          $arrayOfCardIDs = ExecuteMySQLParametrizedQuery($dbConnection, $selectQuery, FALSE, 'ss', $errorOut, array(&$param1, &$param2) ); // Make sure the parameters in an array are passed by reference
      
          if ($arrayOfCardIDs === NULL) 
              echo 'error ' . $errorOut;
          else
          {
              echo 'obtained result array of ' . count($arrayOfCardIDs) . 'selected rows';
      
              if (count($arrayOfCardIDs) > 0) 
                  echo 'obtained card id = ' . $arrayOfCardIDs[0]['CardID'];
          }