2013-12-10 48 views
0

我工作的一个PHP应用程序,我尝试使用的mysqli与功能赢得成功:mysqli_stmt_bind_param:类型不匹配不会引发错误

function executeUpdateInsert($SQLStatement, $SQLBindString, $bindValueArray){ 
$ret = -1; 
$dbConnection = getDbConnection(); 
$stmt = mysqli_prepare($dbConnection, $SQLStatement); 
$bindParamArray = array_merge(array($stmt, $SQLBindString), $bindValueArray); 
call_user_func_array (mysqli_stmt_bind_param , $bindParamArray); 

if(mysqli_stmt_execute($stmt)) { 
    $ret = mysqli_insert_id ($dbConnection);  
    mysqli_stmt_close($stmt); 
    $dbConnection->close(); 
}else{ 
    mysqli_stmt_close($stmt); 
    $dbConnection->close(); 
} 
return $ret; 
} 

函数调用看起来像:

executeUpdateInsert("UPDATE mytable(int1, int2, string2)VALUES (?,?,?)", "iis", array (12,42,"string"))); 

这实际上是工作,虽然我发现一个非常奇怪的行为,当我尝试在数据库中插入非整数像125r896值。在一个完美的世界中,我期望mysqli_stmt_execute($stmt)返回FALSE并失败,但不是它会在整数字段中插入125。

我是不是做了一些不正确的事,或者它是PHP + MySQL语句对象的正常行为?
因为我清楚地认为,作为一个错误,而不是一个功能。

+0

它将值'125r896'投射到一个int,并给你125. –

回答

2

mysqli_stmt_bind_param()不会验证您的数据,它强制数据类型。你需要验证你的数据是你期望的。

+0

我绝对讨厌PHP。谢谢。 – Kiwy

+0

如果您需要数据验证,您可能需要像[Doctrine](http://doctrine-project.org/)或[Propel](http://propelorm.org/)这样的ORM。 – tadman

+0

@tadman或不是我的产品真的很小 – Kiwy