I try to use mysqli::prepare() for savety reasons, but if I try to prepare the where-clause with "?" mysqli::bind_params() fails (without any errors):
Call to the query function:
$messages = query('SELECT * FROM messages WHERE (receiverID=? AND receiverType=?) OR (senderID=? AND senderType=?) ORDER BY date DESC', false, '', (int)$_SESSION['ID'], (string)$_SESSION['mode'][0], (int)$_SESSION['ID'], (string)$_SESSION['mode'][0]);
Query function:
function query($sql, $fetch, $error, ...$values) {
global $language; //get translations
global $mysqli; //get database
$returnResult = (strtolower(substr(trim($sql), 0, 6)) === 'select'); //check for select ---> retrun result
if(!empty($error)) $error .= '\n'; //next line after error message (styling / readability)
$stmt = $mysqli->prepare($sql) or back($error.$language['mysqliErrorPrepare'].$stmt->error); //prepare
foreach($values as $value) { //go through all params
$stmt->bind_param((is_string($value)?'s':(is_float($value)?'d':(is_int($value)?'i':'b'))), $value) or back($error.$language['mysqliErrorBind'].$stmt->error); //bind param
}
$stmt->execute() or back($error.$language['mysqliErrorExecute'].$stmt->error); //execute
if($returnResult) $result = $stmt->get_result() or back($error.$language['mysqliErrorGetResult'].$mysqli->error); //get result if necessary
$stmt->close(); //close
if($returnResult AND $fetch) $result = $result->fetch_assoc()or back($error.$language['mysqliErrorFetch'].$mysqli->error); //fetch if required
return ($returnResult?$result:true); //return result / true
}
Questions:
- Why does it fail?
- Can I prepare the where-clause?
Thank you! - Minding