sirve que para mysqli_stmt mysql_fetch_assoc get_result fetch_assoc bind_result assoc array php mysqli

php - que - Single Value Mysqli



mysql_fetch_assoc mysqli (8)

Intento escribir una función que compruebe un único valor en el DB usando mysqli sin tener que colocarlo en una matriz. ¿Qué más puedo hacer además de lo que ya estoy haciendo aquí?

function getval($query){ $mysqli = new mysqli(); $mysqli->connect(HOST, USER, PASS, DB); $result = $mysqli->query($query); $value = $mysqli->fetch_array; $mysqli->close(); return $value; }


A pesar de que hay muchos defectos en su implementación (¡solo conexión repetida!), Así como en otras respuestas (una línea a costa de mover los parámetros fuera de la pantalla), hay uno esencial:

Dicha función debe tener soporte para Declaraciones preparadas

De lo contrario, será terriblemente inseguro .

Por lo tanto, la única forma aceptable de llamar a dicha función será

$name = getVal($query, $param1, $param2);

o

$name = getVal($query, [$param1, $param2]);

lo que permite que $query contenga solo marcadores de posición, mientras que los datos reales deben agregarse por separado. Cualquier otra variante, incluidas todas las demás respuestas publicadas aquí, nunca debe ser utilizada .

Asumiendo el hecho de que necesitamos otras funciones del tipo (como getRow() , getAll() ), sería lógico combinarlas todas en una clase. Para mysqli puedes usar mi envoltorio safeMysql :

$name = $db->getOne("SELECT name FROM users WHERE id = ?i", $id);

como puede ver, tiene una sintaxis extremadamente concisa y es perfectamente segura.

Si no desea utilizar contenedores de terceros, le recomiendo encarecidamente que use PDO como API de respaldo, simplemente porque la implementación basada en mysqli resultaría en una cantidad insana de código . Simplemente compare estas 2 funciones, una usando 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 uno que usa PDO:

function getVal($query, $params = array()) { global $pdo; $stmt = $pdo->prepare($query); $stmt->execute($params); return $stmt->fetchColumn(); }

y puedes ver claramente la diferencia.

De cualquier forma, terminarás usando esta función como esta

$name = getVal("SELECT name FROM users WHERE id = ?", [$id]);

ya que es la única forma adecuada y segura de llamar a dicha función, mientras que todas las demás variantes carecen de seguridad, legibilidad, manejo de errores y cordura.


Esto es lo que terminé con:

function get_col($sql){ global $db; if(strpos(strtoupper($sql), ''LIMIT'') === false) { $sql .= " LIMIT 1"; } $query = mysqli_query($db, $sql); $row = mysqli_fetch_array($query); return $row[0]; }

De esta forma, si olvida incluir LIMIT 1 en su consulta (todos lo hemos hecho), la función lo agregará.

Ejemplo de uso:

$first_name = get_col("SELECT `first_name` FROM `people` WHERE `id`=''123''");


Esto no evita por completo la matriz, pero prescinde de ella en una línea.

function getval($query) { $mysqli = new mysqli(); $mysqli->connect(HOST, USER, PASS, DB); return $mysqli->query($query)->fetch_row()[0]; }


Incluso este es un tema viejo, no veo aquí de una manera bastante simple que solía usar para dicha asignación:

list($value) = $mysqli->fetch_array;

puede asignar directamente más variables, no solo una, y así puede evitar el uso de matrices por completo. Ver la list() funciones php list() para más detalles.


La extensión mysql podría hacer esto usando mysql_result, pero mysqli no tiene una función equivalente a la actual, afaik. Siempre devuelve una matriz.

Si no solo creé el registro, lo hago de esta manera:

$getID = mysqli_fetch_assoc(mysqli_query($link, "SELECT userID FROM users WHERE something = ''unique''")); $userID = $getID[''userID''];

O si simplemente creé el registro y la columna de ID de usuario es AI, lo hago:

$userID = mysqli_insert_id($link);


Pruebe algo como esto:

$last = $mysqli->query("SELECT max(id) as last FROM table")->fetch_object()->last;

Aclamaciones


Qué tal si

$name = $mysqli->query("SELECT name FROM contacts WHERE id = 5")->fetch_object()->name;


Siempre es mejor crear la conexión una vez al principio y cerrarla al final. Así es como implementaría tu función.

$mysqli = new mysqli(); $mysqli->connect(HOSTNAME, USERNAME, PASSWORD, DATABASE); $value_1 = get_value($mysqli,"SELECT ID FROM Table1 LIMIT 1"); $value_2 = get_value($mysqli,"SELECT ID FROM Table2 LIMIT 1"); $mysqli->close(); function get_value($mysqli, $sql) { $result = $mysqli->query($sql); $value = $result->fetch_array(MYSQLI_NUM); return is_array($value) ? $value[0] : ""; }