2012-07-24 64 views
1

我已经使用PHP的旧MySQL库了很多年了,我终于开始使用MySQLi了。预先准备好的陈述看起来非常有用,所以我试图把它们挂出来。范围和MySQLi绑定

现在,我创造了一些准备好的发言和约束力的全球性的参数,然后使用函数像这样执行它们:

$stmt = $mysqli->prepare("INSERT ..."); 
$stmt->bind_param("ss", $var1, $var2); 

function process($t) { 
    global $mysqli, $stmt; 
    $var1 = $t['var1']; 
    $var2 = $t['var2']; 
    $stmt->execute(); 
} 

我遇到的问题是,执行功能运行进入一个变量仍然为空的错误。在收集$t的值时,我应该绑定/解除绑定吗?

+2

'bind_param()'需要变量引用,所以如果你把它叫做outisde函数,需要在函数内全局访问'$ var1,$ var2'。函数内部的函数是局部范围的,与外部绑定的变量不同。 – 2012-07-24 13:56:30

+0

当然!我以为MySQLi正在用'bind_param'做一些魔术 - 这里还是相当早的,所以请原谅认知胀气。 – actaeon 2012-07-24 14:02:53

回答

-1

我这样一个虚拟的:

$stmt = $mysqli->prepare("INSERT INTO table (col1, col2) VALUES(?, ?)"); 

function process($t) { 
    global $mysqli, $stmt; 
    $var1 = $t['var1']; 
    $var2 = $t['var2']; 
    $stmt->bind_param("ss", $var1, $var2); 
    $stmt->execute(); 
} 

我认为MySQLi正在与变量进行一些魔术绑定。 在这种情况下,bind_param只是将值放入准备好的语句中,而不是声明某些变量与语句“绑定”。

0

我觉得把这样的代码应该工作: (假设$ T阵列在()中的变量存在)

function process ($t) { 
    global $mysqli; 
    $var1 = $t['var1'];  
    $var2 = $t['var2']; 

    $stmt = $mysqli->prepare("INSERT ..."); 
    $stmt->bind_param("ss", $var1, $var2); 
    $stmt->execute(); 

} 
+0

我有理由使我的准备好的陈述全球化(因为我不想每次重新开始流程都准备一份新陈述)。我认为这不会让我感到困惑,这是'bind_param'实际上的作用。 – actaeon 2012-07-24 14:07:20