Chociaż istnieje wiele błędy w implementacji, a także w innych odpowiedzi (? One-liner kosztem przesuwając parametry poza ekranem), istnieje zasadnicza jeden:
Taka funkcja powinna mieć poparcie dla sprawozdania przygotowanego
W przeciwnym razie będzie to horribly insecure.
Tak więc jedynym akceptowanym sposobem wywołania taka funkcja będzie
$name = getVal($query, $param1, $param2);
lub
$name = getVal($query, [$param1, $param2]);
umożliwiając $query
zawierać tylko elementy zastępcze, podczas gdy rzeczywiste dane muszą być dodane oddzielnie. Żadnego innego wariantu, w tym wszystkich innych opublikowanych tutaj odpowiedzi, nie należy nigdy używać.
Zakładając, że potrzebujemy innych funkcji tego typu (takich jak getRow()
, getAll()
), logiczne byłoby połączenie ich wszystkich w jedną klasę. Dla mysqli można używać mojego safeMysql wrapper:
$name = $db->getOne("SELECT name FROM users WHERE id = ?i", $id);
jak widać, ma niezwykle zwięzły składnię i całkowicie bezpieczne.
Jeśli nie chcesz korzystać z owijarki osób trzecich, wówczas będę zdecydowanie radzimy używać jako podkładu PDO API, po prostu dlatego, że implementacja mysqli oparte skutkowałaby szalonej ilości kodu. Wystarczy porównać te 2 funkcje, jeden przy użyciu 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;
}
i jeden za pomocą PDO:
function getVal($query, $params = array())
{
global $pdo;
$stmt = $pdo->prepare($query);
$stmt->execute($params);
return $stmt->fetchColumn();
}
i można wyraźnie zobaczyć różnicę.
Tak czy inaczej, będziesz skończyć przy użyciu tej funkcji jak ten
$name = getVal("SELECT name FROM users WHERE id = ?", [$id]);
jak jest to jedyny właściwy i bezpieczny sposób, aby wywołać taką funkcję, podczas gdy wszystkie inne warianty brak zabezpieczeń, czytelności, obsługę błędów i zdrowie psychiczne.
lub zmień 'assoc' do' array' a następnie można zrobić '$ getID [0]' – rybo111
I nikt, nikt, nikt nie dba, że jedyną znaczącą część tej długo szukał "one-liner" zniknął daleko poza widocznym ekranem ... –
spadł wyłącznie dlatego, że 'fetch_object()' istniał wiele lat przed tą odpowiedzią, która zwraca prosty obiekt, co oznacza, że w momencie pisania tego mysqli miał lepszą opcję. Również twoja odpowiedź jest zapisana w poleceniach proceduralnych, podczas gdy pytanie OP zostało napisane za pomocą mysqli opartego na obiektach. – skrilled