Php 重用对同一sql表的同一调用的有效方法

Php 重用对同一sql表的同一调用的有效方法,php,mysql,Php,Mysql,所以我搜索这个标题,希望有人已经回答了。然而,我在其他语言上遇到了类似的主题,但不是PHP,所以这可能会帮助其他人 我一直在使用下面的脚本来调用数据库,但是我如何创建它,以便只在类的顶部创建一次,并在类页面上需要它的每个方法中使用它呢。示例:一个页面可能没有来自同一个表的所有数据,但如果该表包含该页面50%或更多的数据,我如何修改它,以便只说一次,并让下面的其余脚本通过调用一次来显示它首先提取的数据 这是我现在拥有的 <?php if($res = $dbConn->quer

所以我搜索这个标题,希望有人已经回答了。然而,我在其他语言上遇到了类似的主题,但不是PHP,所以这可能会帮助其他人

我一直在使用下面的脚本来调用数据库,但是我如何创建它,以便只在类的顶部创建一次,并在类页面上需要它的每个方法中使用它呢。示例:一个页面可能没有来自同一个表的所有数据,但如果该表包含该页面50%或更多的数据,我如何修改它,以便只说一次,并让下面的其余脚本通过调用一次来显示它首先提取的数据

这是我现在拥有的

<?php
    if($res = $dbConn->query("SELECT Column FROM Table")){
        while($d = $res->fetch_assoc()){
            printf("Enter HTML here with proper %s", $d['Column']);
        }
    }
?>
我想在没有printf的情况下调用它;收集并存储数据,这样我就可以调用结果,同时用其他方法打印或回显HTML结果。什么是最有效的方法?我不想一次又一次地打同一个电话。。。好吧,你明白了


我应该使用fetch\u数组还是仍然可以使用fetch\u assoc执行此操作?

您需要一个函数,该函数将查询作为参数并返回结果

像这样:

public function generate_query($sql) {
    if($res = $dbConn->query($sql)){
        while($d = $res->fetch_assoc()){
            printf("Enter HTML here with proper %s", $d['Column']);
        }
    }
}

不太确定这是否是你想要的答案。 您可以在要使用该功能的页面顶部使用include/include\u once/require/require\u once

例如:

general_function.php:
-----
function generate_form( $dbConn, $sql ) {
    if($res = $dbConn->query("SELECT Column FROM Table")) {
        while($d = $res->fetch_assoc()) {
            printf("Enter HTML here with proper %s", $d['Column']);
        }
    }
}
对于那些你想使用函数的页面,只需

include "$PATH/general_function.php";
并调用生成表单

尝试以下操作:

class QueryStorage {
    public static $dbConn = null;
    public static $results = [];

    public static function setConnection($dbConn) {
      self::$dbConn = $dbConn;
    }

    public static function query($query, $cache = true) {
      $result = (array_key_exists($query, self::$results))? 
                self::$results[$query] : self::$dbConn->query($query);
      if($cache) {
        self::$results[$query] = $result;
      }

      return $result;
    }

    public static function delete($query) {
      unset(self::$results[$query]);
    }

    public function clean() {
      self::$results = [];
    }
}
用法:

在顶部某处传递到类的连接:

QueryStorage::setConnection($dbConn);
查询并存储它:

$result = QueryStorage::query("SELECT Column FROM Table", true);

if($result){
  while($d = $result->fetch_assoc()){
    printf("Enter HTML here with proper %s", $d['Column']);
  }
}
在任何地方重复使用它:

$result = QueryStorage::query("SELECT Column FROM Table", true); // it will return same result without querying db second time
记住:它是运行时缓存,不会存储第二次脚本运行的结果。为此,您可以修改当前类以使其 与memcache、redis、apc等合作


如果我理解正确,那么诀窍就是创建一个关联数组,并使用其“键”访问代码

     $dataArray = array();
    // Add extra column in select query for maintaining uniqness. 'id' or it can be any unique value like username.

    if($res = $dbConn->query("SELECT Column,id FROM Table")){
        while($d = $res->fetch_assoc()){
            $dataArray[$d['id']] = $d['Column'];
        }
    }

    //you have value in the array use like this:
    echo $dataArray['requireValueId'];
    //or , use 'for-loop' if you want to echo all the values

你能不能把查询放在一个返回结果的函数中?然后,您可以在任何地方调用该函数,并对返回的结果执行任何操作。编辑:或者,如果您谈论的是查询本身的实际效率,那么看看缓存查询在本例中,返回结果的最有效方式是什么?使用相同的代码,但不是printf,而是使用return?或者你有更雄辩的方式来写这个吗?我喜欢这个版本,查询和存储部分只在页面顶部做一次?或者它在其他地方使用?你们在顶部包括类,然后在顶部通过连接链接。只需执行$result=QueryStorage::querySELECT表中的列;在你需要的地方。它将无缝地将查询结果存储在类结果数组中。听起来很棒!谢谢