Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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 这个Mysql助手类有问题吗?_Php_Mysql_Wrapper_Helper - Fatal编程技术网

Php 这个Mysql助手类有问题吗?

Php 这个Mysql助手类有问题吗?,php,mysql,wrapper,helper,Php,Mysql,Wrapper,Helper,我的数据库类中有这个函数。 它接受3个参数: 询问 要在其上执行它的服务器,该服务器由存储在配置文件中的名称标识 在sql查询中引用的参数数组 示例调用: $toplist = MyDbClass->q('SELECT * FROM movies WHERE score > ?','slaveserver1',array(100)); 代码来了 /* * @param the sql query. may be pure sql or having ? as placehol

我的数据库类中有这个函数。 它接受3个参数:

  • 询问
  • 要在其上执行它的服务器,该服务器由存储在配置文件中的名称标识
  • 在sql查询中引用的参数数组
示例调用:

$toplist = MyDbClass->q('SELECT * FROM movies WHERE score > ?','slaveserver1',array(100));
代码来了

/*
 * @param the sql query. may be pure sql or having ? as placeholders for variables that are passed in the 3rd param, not enquoted
 * @param name of the link (slave or master server or other arbitrary database)
 * @param optional array of vars that will be filled in where the ? signs in the query are
 */
public function q($sql,$name,$vars=false) {
    // lets see if the link to the server with name $name has already been initialised, if not lets do it
    if(!isset($this->links[$name])) {
        $this->initialize($name);
    }
    // if variables have been passed, lets fill them into the query
    if($vars !== false) {
        // first real scape them all according to the correct link
        for($i=0;$i<count($vars);$i++) {
            $vars[$i] = mysql_real_escape_string($vars[$i],$this->links[$name]);
        }
        // now escape all actual % signs so they are not used as placeholders vor vsprintf
        $sql = str_replace('%','%%', $sql);
        // no add '' quotes arround every placeholder and fill in
        $sql = str_replace('?','\'%\'', $sql);
        $sql = vsprintf($sql,$args);
    }
    // now execute the parsed query on the correct server
    return mysql_query($sql,$this->links[$name]) or die(mysql_error($this->links[$name]));
}
/*
*@param用于sql查询。可能是纯sql还是有?作为在第三个参数中传递的变量的占位符,不带引号
*@param链接名称(从属或主服务器或其他任意数据库)
*@param可选变量数组,将在何处填充?查询中的符号是
*/
公共函数q($sql,$name,$vars=false){
//让我们看看到名为$name的服务器的链接是否已经初始化,如果没有,让我们这样做
如果(!isset($this->links[$name])){
$this->initialize($name);
}
//如果已经传递了变量,让我们将它们填充到查询中
如果($vars!==false){
//首先,根据正确的链接将它们全部替换
对于($i=0;$ilinks[$name]);
}
//现在转义所有实际的%符号,这样它们就不会用作vsprintf的占位符
$sql=str_replace('%','%',$sql);
//每个占位符周围都没有添加“”引号,请填写
$sql=str\u replace(“?”,“\'%\'',$sql);
$sql=vsprintf($sql,$args);
}
//现在在正确的服务器上执行已解析的查询
返回mysql_查询($sql,$this->links[$name])或死亡(mysql_错误($this->links[$name]);
}
现在我的问题是:

我的代码有问题吗?特别是:

  • 是否有任何情况下,在查询中的参数周围加上“”引号会导致查询不起作用
  • 是否有一些优雅的方法可以防止我的函数在我的查询中以双引号结束,比如
    where score>“100”
    (如果我已经在输入查询中输入了qutoE…)
  • 你觉得这个功能怎么样?这样做的好方法

    • 我认为,允许一个类操作多个SQL连接不是一个好主意。应该允许该类的每个实例只使用一个SQL连接。或者,如果您正试图实现某种手动负载平衡,则应该对用户透明地使用,可能只允许“从”和“主”选择

      也许,您应该将查询分为“读”和“写”两类,因为您可以从任何从机“读”,但应该“写”到所有从机

      另外,若查询分派是为了负载平衡,那个么您需要在类构造函数中打开连接,而不是在查询中懒洋洋地打开它们。一个脚本是一个非常短的生物。除非为长期操作编写CLI脚本,否则无需延迟连接,直到查询真正执行为止。

      我想你弄错了:)目的是仅在需要时启动连接,在服务器上进行第一次查询。主要用途是读/写连接,但也可能有其他连接。例如,有些是很少需要的。initialise然后从conflig类中获取正确的连接信息,并根据需要建立连接。系统运行良好。现在,我只传递了完整的查询,并通过这个$args的东西增强了类。