Aunque hay muchos defectos en su aplicación, así como en otras respuestas (? una sola línea en el costo de trasladar los parámetros fuera de la pantalla), hay uno esencial:
Tal función debe tener soporte para comandos preparados
lo contrario, será horribly insecure.
Por lo tanto, la única manera aceptable para llamar a una función de este tipo será
$name = getVal($query, $param1, $param2);
o
$name = getVal($query, [$param1, $param2]);
permitiendo $query
a contener sólo marcadores de posición, mientras que los datos real tiene que ser añadido por separado. Cualquier otra variante, incluidas todas las demás respuestas publicadas aquí, , nunca debe usarse.
Suponiendo que necesitamos otras funciones del tipo (como getRow()
, getAll()
), sería lógico combinarlas todas en una clase. Para mysqli puedes usar mi safeMysql wrapper:
$name = $db->getOne("SELECT name FROM users WHERE id = ?i", $id);
como se puede ver, que tiene una sintaxis muy concisa y perfectamente seguro.
Si no desea utilizar las envolturas de terceros, entonces me aconsejo encarecidamente que utilice DOP como una API de respaldo, simplemente porque implementación basada en mysqli resultaría en una cantidad insana de código . Basta con comparar estas 2 funciones, una utilizando mysqli:
function getVal($sql, $values = array())
{
global $mysqli;
$stm = $mysqli->prepare($sql);
if ($values)
{
$types = str_repeat("s", count($values));
if (strnatcmp(phpversion(),'5.3') >= 0)
{
$bind = array();
foreach($values as $key => $val)
{
$bind[$key] = &$values[$key];
}
} else {
$bind = $values;
}
array_unshift($bind, $types);
call_user_func_array(array($stm, 'bind_param'), $bind);
}
$stm->execute();
$stm->bind_result($ret);
$stm->fetch();
return $ret;
}
y el otro con DOP:
function getVal($query, $params = array())
{
global $pdo;
$stmt = $pdo->prepare($query);
$stmt->execute($params);
return $stmt->fetchColumn();
}
y se puede ver claramente la diferencia.
De cualquier manera, usted va a terminar el uso de esta función como esta
$name = getVal("SELECT name FROM users WHERE id = ?", [$id]);
ya que es la única manera adecuada y segura para llamar a una función de este tipo, mientras que todas las demás variantes carecen de seguridad, facilidad de lectura, manejo de errores y cordura.
o cambiar '' assoc' a array' y entonces usted puede hacer '$ getID [0]' – rybo111
Y nadie, nadie, nadie le importa que la única parte significativa de esta largamente buscada "de una sola línea" se ha ido mucho más allá de la pantalla visible ... –
downvoted únicamente porque 'fetch_object()' existió muchos años antes de esta respuesta, que devuelve un objeto simple, lo que significa que en el momento de escribir este mysqli tenía una mejor opción. También su respuesta está escrita en comandos de procedimiento mientras que la pregunta de OP fue escrita a través de mysqli basado en objetos. – skrilled