Php 动态绑定$bind_param()中的参数;Mysqli

Php 动态绑定$bind_param()中的参数;Mysqli,php,mysqli,prepare,bindparam,Php,Mysqli,Prepare,Bindparam,我有一个数据库类,它处理所有的查询,将作出的数据库 我有我的QLI准备工作很好。 bind_param也可以正常工作,但问题是我想动态定义变量类型。 这是我的密码 public function query($sql, $params = array()){ $this->_error = false; if($this->_query = $this->_mysqli->prepare($sql)){ $x = 1

我有一个数据库类,它处理所有的查询,将作出的数据库 我有我的QLI准备工作很好。 bind_param也可以正常工作,但问题是我想动态定义变量类型。 这是我的密码

public function query($sql, $params = array()){
        $this->_error = false;
        if($this->_query = $this->_mysqli->prepare($sql)){
            $x = 1;
            if(count($params)){
                foreach($params as $param){
                    $this->_query->bind_param($x, $param);
                    $x++;
                }
            }
在PDO中,fist参数定义了位置,我猜这个函数通过每次设置X=1和X++运行良好, 但在
bind_param
中,我猜第一个参数定义了类型 正如php.net手册所说 那个么,若用户按下我设置的积分值,有什么办法吗 x=i 对于字符串 x=s 依此类推,适用于所有4种类型

有什么想法吗,伙计们


提前感谢您的输入,这很简单。只要一直使用
s

还有一个更复杂的问题:事实上,您不能在循环中绑定,因此,必须使用
call\u user\u func()

请注意,不应将语句分配给局部变量,错误变量也没有用处。例外情况在各方面都更好

查看上面的代码,在转换PDO之前,您应该三思而后行,这样的函数只需要三行代码:

public function query($sql, $params = array())
{
    $stmt = $this->_pdo->prepare($sql);
    $stmt->execute($params);
    return $stmt;
}

如果您没有PDO方面的经验,下面是我编写的一个示例,您将从中了解到它是最简单但功能最强大的数据库API,只需很少的代码就可以获得几十种不同格式的数据。

下面是一个可能有所帮助的示例(
prepare()
函数是一种类方法)

用法示例:

$db->prepare( "SELECT * FROM user WHERE user_name = ? OR user_email = ?", [ 'ss', $user_name, $user_name ] );

如果我也使用s来表示积分?我在PDO中没有命令,这就是我选择mysqli的原因,因为我比你建议的PDO更了解它?在PDO中,我通过在开始时说x=1表示第一名来实现它。最后我说x++意味着下一次x=2,所以发送时间将绑定到第二个参数。但是我同意你对mysqli的看法,那么我可以使用你定义的方法吗?这完全是我问题的替代方案?我很喜欢你的想法,让我试试看,直到@your common sense回答我的问题。如果我想选择*而没有任何参数,比如
select*from members
@SaeedAnsari,
$bind
是一个可选参数,只需使用
$db->prepare(“select*from members”)谢谢我现在正在使用它:)当我选择使用它的数据时,它工作正常,但是如果我使用这个查询插入数据,我会调用一个成员函数fetch_assoc(),如果stmt成功执行,我将使用这三行代码
$result=$stmt->get_result();返回$result->fetch_assoc();返回$result->num\u行
public function query($sql, $params = array())
{
    $stmt = $this->_pdo->prepare($sql);
    $stmt->execute($params);
    return $stmt;
}
function prepare( $query, $bind = array() )
{   
    if ( !$stmt = $this->mysqli->prepare( $query ) ) 
        throw new Exception( 'Query failed: ' . $query . PHP_EOL . $this->mysqli->error );  

    // if $bind is not an empty array shift the type element off the beginning and call stmt->bind_param() with variables to bind passed as reference
    if ( $type = array_shift( $bind ) )
        call_user_func_array( 
            array( $stmt, 'bind_param' ), 
            array_merge( array( $type ), array_map( function( &$item ) { return $item; }, $bind ) ) 
        );

    if ( !$stmt->execute() ) 
        throw new Exception( 'Execute failed: ' . PHP_EOL . $stmt->error );

    // choose what to return here ( 'affected_rows', 'insert_id', 'mysqli_result', 'stmt', 'array' ) 

}
$db->prepare( "SELECT * FROM user WHERE user_name = ? OR user_email = ?", [ 'ss', $user_name, $user_name ] );