2016-02-28 82 views
1

我正在尝试创建一个数据库查询函数,它可以接受多个参数并在其他地方重复使用,但尝试了许多类似于我的方法的在线方法,并且它们没有按预期工作。MySQLi动态准备函数与数组绑定

function query($query, $bindings, $type)

我希望能够运行查询与此单一功能去,这种类型的功能更容易与PDO司机很多,你可以简单地进入里面->execute($binding);绑定然而,在这种情况下,我不得不使用MySQLi,因为当前应用程序依赖于它,但希望将其升级为使用预准备语句。

我需要如何能够使用的功能,以确保它的一个例子是可重复使用和灵活:

$engine->query("SELECT * FROM accounts WHERE email = :mail AND id = :id",array(':mail' => $_POST['mail'], ':id' => 2))->fetch_assoc();

让分裂他们每个人的了。首先是声明,然后是用于绑定所用参数的数组,然后是参数的类型,最后是在查询(ASSOC,OBJECT,ARRAY)中使用的fetch_的类型等。

"SELECT * FROM accounts WHERE email = :mail AND id = :id", array(':mail' => $_POST['mail'], ':id' => 2), "si" ->fetch_assoc();

+0

什么是这个问题。是吧? –

+1

问题是我如何创建这样一个功能,它是灵活的,可以重用 – mhvvzmak1

回答

2

虽然要实现命名参数将是一项相当艰巨的任务,其余部分相当可行。

一个PHP> = 5.6的变体,实现图示操作:

function query($query, $params = NULL, $types = NULL) 
{ 
    if (!$params) 
    { 
     return $mysqli->query($query); 
    } 
    $statement = $this->mysqli->prepare($select); 
    $types = $types ?: str_repeat('s', count($params)); 
    $statement->bind_param($types, ...$params); 
    $statement->execute(); 
    return $statement->get_result(); 
} 

像这样使用

$sql = "SELECT * FROM accounts WHERE email = ? AND id = ?"; 
$row = $engine->query($sql, [$_POST['mail'], 2])->fetch_assoc(); 

,或者,如果你想设置的类型明确

$row = $engine->query($sql, [$_POST['mail'], 2], "si")->fetch_assoc(); 
+1

谢谢:)我可以问一下bind_params里的“...”部分吗? – mhvvzmak1

+1

它是图示运算符 –

+0

从来没有见过它,似乎有趣的将查找它! ; d – mhvvzmak1