1.- Así es. Básicamente la gracia está en que evalúas el tipo de dato. Si no es un número, entonces debe ser un string y será tratado como tal. Como no son necesarias las comillas, sino que estás trabajando directamente con un tipo de dato string, la base de datos lo tratará como tal

(Evitando de paso todo tipo de inyección)
2.- Obvio

Así es como lo hice
3.- jajajaja ... cambia un poco el concepto, pero en el fondo es la misma mie*** con otro olor no más
4.- uff... ya ni me acuerdo, pero era algo así
Así es como lo tengo implementado yo, puedes omitir la parte de la caché (primera condicional).
Código PHP:
/*
** Function that prepares and binds the query, or does nothing if an valid cache file is found.
*/
private function execute_query($arg_array = NULL) {
if ($this->cache_query === FALSE OR $this->cache_recreate === TRUE) {
$sql_query = array_shift($arg_array);
$types = '';
foreach ($arg_array as $v) {
switch ($v) {
case is_string($v):
$types .= 's';
break;
case is_int($v):
$types .= 'i';
break;
case is_double($v):
$types .= 'd';
break;
}
}
if (isset($this->stmt)) unset($this->stmt);
if (!$this->stmt = $this->db->prepare($sql_query)) $this->logError($sql_query,$this->db->errno,'fatal',$this->db->error);
if (isset($arg_array[0])) {
array_unshift($arg_array,$types);
if (!$this->error) {
if (!$execute_query = @call_user_func_array(array($this->stmt,'bind_param'),$arg_array)) {
$this->logError($sql_query,$this->stmt->errno,'fatal','Failed to bind. Do you have equal parameters for all the \'?\'?');
$execute_query = FALSE;
}
}
else $execute_query = FALSE;
}
else {
if (!empty($sql_query)) $execute_query = TRUE;
else $execute_query = FALSE;
}
if ($execute_query) {
$this->stmt->execute();
$this->stmt->store_result();
}
elseif (!$this->error) $this->logError($sql_query,0,'non-fatal','General error: Bad query or no query at all');
}
}
Como ves, evalúo el tipo de dato de acuerdo a si PHP me indica que es un string o no. Lo que me falta hacer, es poder validar los datos de tipo booleano. Se hace con is_boolean() pero no me he dado la paja de actualizarlo, puede que me de un par de problemas si el valor es un entero con valor 1 ó 0.
Lo que dejé arriba es sólo la forma en que el usuario finalmente lo ocupará. La gracia detrás de eso es la class xD
Recién me di cuenta que cuando hiciste este tema todavía no había publicado mi class xDDDD
En noviembre lo publiqué, lo puedes bajar desde acá:
Extended MySQLi (mysqli) - PHP Classes
Esa es la versión final, creo que te había enviado uno que funcionaba a medias no más xD
Saludos !!