Mysqli de valor único

Estou tentando escrever uma function que irá verificar por um único valor no db usando mysqli sem ter que colocá-lo em uma matriz. O que mais posso fazer além do que eu já estou fazendo aqui?

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 extensão mysql poderia fazer isso usando mysql_result, mas mysqli não tem function equivalente a partir de hoje, afaik. Ele sempre retorna uma matriz.

Se eu não criasse apenas o registro, eu faço isso assim:

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

Ou se eu simplesmente crie o registro e a coluna userID é AI, eu faço:

 $userID = mysqli_insert_id($link); 

E se

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

Sempre melhor criar a conexão uma vez no início e fechar no final. Veja como eu implementaria sua function.

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

Eis o que acabei com:

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

Desta forma, se você esquecer de include LIMIT 1 na sua consulta (todos nós fizemos isso), a function irá adicioná-lo.

Exemplo de uso:

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

Mesmo este é um tópico antigo, não vejo aqui uma maneira bastante simples de usar para essa tarefa:

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

você pode atribuir diretamente mais variables, não apenas uma, e assim você pode evitar o uso de arrays completamente. Consulte a lista de funções php () para obter detalhes.

Embora existam muitas falhas em sua implementação (conexão repetida sozinha!), Bem como em outras respostas (um one-liner com o custo de mover parâmetros fora da canvas?), Há um essencial:

Essa function deve ter suporte para declarações preparadas

Caso contrário, será horrivelmente insegura .

Assim, a única maneira aceitável de chamar essa function será

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

ou

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

permitindo que a $query contenha apenas espaços reservados, enquanto os dados reais devem ser adicionados separadamente. Qualquer outra variante, incluindo todas as outras respostas postadas aqui, nunca deve ser usada .

Supondo o fato de que precisamos de outras funções do tipo (como getRow() , getAll() ), seria lógico combiná-los todos em uma class. Para o mysqli, você pode usar o meu invólucro SafeMysql :

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

Como você pode ver, tem syntax extremamente concisa e perfeitamente segura.

Se você não quiser usar invólucros de terceiros, então recomendarei que você use o DOP como uma API de suporte, simplesmente porque a implementação baseada em mysqli resultaria em uma quantidade insana de código . Basta comparar essas 2 funções, uma 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; } 

E um usando DOP:

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

e você pode ver claramente a diferença.

De qualquer forma, você acabará usando esta function assim

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

pois é a única maneira adequada e segura de chamar essa function, enquanto todas as outras variantes não têm segurança, legibilidade, manipulação de erros e sanidade.

Isso não evita completamente a matriz, mas dispensa isso em uma única linha.

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

Experimente algo como isto:

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

Felicidades