web-dev-qa-db-fra.com

Valeur unique Mysqli

J'essaie d'écrire une fonction qui vérifie une seule valeur dans la base de données en utilisant mysqli sans avoir à la placer dans un tableau. Que puis-je faire d'autre que ce que je fais déjà ici?

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

Que diriez-vous

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

L'extension mysql pourrait faire cela en utilisant mysql_result, mais mysqli n'a aucune fonction équivalente à ce jour, autant que je sache. Il retourne toujours un tableau.

Si je ne viens pas de créer le disque, je le fais comme suit:

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

Ou si je viens juste de créer l'enregistrement et que la colonne ID utilisateur est AI, je fais:

$userID = mysqli_insert_id($link);
24
prl77

Il est toujours préférable de créer la connexion une fois au début et de fermer à la fin. Voici comment je mettrais en œuvre votre fonction.

$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] : "";
}
7
jbrahy

Voici ce que j'ai fini avec:

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];
}

Ainsi, si vous oubliez d'inclure LIMIT 1 dans votre requête (nous l'avons tous fait), la fonction l'ajoutera.

Exemple d'utilisation:

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

Même s’il s’agit d’un sujet ancien, je ne vois pas ici le moyen assez simple que j’utilisais pour cette tâche:

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

vous pouvez affecter directement plus de variables, pas seulement une, et ainsi éviter complètement l’utilisation des tableaux. Voir la fonction php list () pour plus de détails.

2
John

Cela n'évite pas complètement le tableau mais s'en dispense sur une seule ligne.

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

Bien qu'il existe de nombreuses failles dans votre mise en œuvre (connexion répétée seule!) Ainsi que dans d'autres réponses (une seule ligne au détriment du déplacement des paramètres hors écran?), Il en existe une essentielle:

Une telle fonction devrait avoir un support pour les déclarations préparées

Sinon, ce sera horriblement peu sûr .

Ainsi, le seul moyen acceptable d’appeler une telle fonction sera

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

ou

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

autoriser $query à ne contenir que des espaces réservés, tandis que les données réelles doivent être ajoutées séparément. Toute autre variante, y compris toutes les autres réponses publiées ici, ne doit jamais être utilisé.

En supposant que nous ayons besoin d’autres fonctions du même type (comme getRow(), getAll()), il serait logique de les combiner toutes dans une classe. Pour mysqli, vous pouvez utiliser mon safeMysql wrapper :

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

comme vous pouvez le constater, sa syntaxe est extrêmement concise et parfaitement sûre. 

Si vous ne souhaitez pas utiliser de wrappers tiers, je vous conseillerai vivement d'utiliser PDO en tant qu'API de sauvegarde, tout simplement parce que l'implémentation basée sur mysqli entraînerait un quantité de code insensé}. Il suffit de comparer ces 2 fonctions, l'une utilisant 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;
}

Et un utilisant AOP:

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

et vous pouvez voir clairement la différence.

De toute façon, vous finirez par utiliser cette fonction comme ceci

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

comme c'est le seul moyen approprié et sûr d'appeler une telle fonction, alors que toutes les autres variantes manquent de sécurité, de lisibilité, de gestion des erreurs et de bon sens.

1
Your Common Sense

Essayez quelque chose comme ça:

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

À votre santé

0
Mick