2012-07-12 15 views
26

Próbuję napisać funkcję, która sprawdzi pojedynczą wartość w db za pomocą mysqli bez konieczności umieszczania go w tablicy. Co jeszcze mogę zrobić oprócz tego, co już tu robię?Jedna wartość Mysqli

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

Odpowiedz

20

Rozszerzenie mysql może zrobić to za pomocą mysql_result, ale mysqli ma równoważną funkcję jak dzisiejszy, AFAIK. Zawsze zwraca tablicę.

Gdybym nie tylko utworzyć rekord, robię to w ten sposób:

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

Albo gdybym nie wystarczy utworzyć rekord i kolumna userID jest AI, robię:

$userID = mysqli_insert_id($link); 
+2

lub zmień 'assoc' do' array' a następnie można zrobić '$ getID [0]' – rybo111

+1

I nikt, nikt, nikt nie dba, że ​​jedyną znaczącą część tej długo szukał "one-liner" zniknął daleko poza widocznym ekranem ... –

+0

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

5

Zawsze najlepiej utworzyć połączenie raz na początku i zamknąć na końcu. Oto, w jaki sposób zrealizowałbym twoją funkcję.

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

to MYSQLI_NUM stała? – Gokigooooks

+0

Tak, jest. http://stackoverflow.com/questions/1684993/what-does-mysqli-num-mean-and-do Z php.net: "Ten opcjonalny parametr jest stałą wskazującą, jaki typ macierzy powinien zostać wytworzony z bieżącego dane wiersza Możliwe wartości tego parametru to stałe MYSQLI_ASSOC, MYSQLI_NUM lub MYSQLI_BOTH. " – jbrahy

+1

Ta odpowiedź i nowsze odpowiedzi Johna i Rybo111 są jedynymi, które bezpośrednio odnoszą się do kodu OP. Pytanie OP pokazuje metodę, która akceptuje ŻADNE kwerendy zwracające skalar - nie wymaga znajomości nazwy pola do zwrócenia. – ToolmakerSteve

-1

spróbować czegoś takiego:

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

Cheers

+1

Zakłada się, że zwracany skalar ma znaną nazwę pola. Nie jest to zgodne z kodem OP, który przechodzi w JAKIEKOLWIEK zapytaniu (oczekuje się, że zwróci pojedynczą wartość, kwerendę "skalarną"). Nie może to być nawet zapytanie o pole rekordu - może to być zwracanie liczby, a nawet zmiennej systemowej. – ToolmakerSteve

4

Oto, co skończyło się z:

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

ten sposób, jeśli zapomni się m.in. LIMIT 1 w zapytaniu (wszyscy to zrobiliśmy), funkcja doda to.

Przykład użycia: (! Powtarzające się połączyć sam)

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

To nigdy nie zadziała. –

+0

@ YourCommonSense Twoja negatywność jest moją motywacją. Naprawiony. – rybo111

+0

Drobny problem: zapytanie może zawierać "limit" (małe litery) zamiast "LIMIT".Więc jeśli użyjesz części odpowiedzi zawierającej 'LIMIT', możesz chcieć wykonać test' if (strpos ($ sql, 'LIMIT') === false && strpos ($ sql, 'limit') === false) {' – ToolmakerSteve

1

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.

+0

Nie tylko nie możesz napisać spójnej funkcji, ale także nie możesz odczytać innej odpowiedzi :) –

20

Jak o

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

Wyjaśnij * dlaczego * Twój kod rozwiązuje problem. Zobacz odpowiedź]. – brasofilo

+4

To jest najkrótsza linia kodu dla uzyskania wartości wyniku mysqli. –

+0

Zakłada się, że zwracany skalar ma znaną nazwę pola. Nie jest to zgodne z kodem OP, który przechodzi w JAKIEKOLWIEK zapytaniu (oczekuje się, że zwróci pojedynczą wartość, kwerendę "skalarną"). Nie może to być nawet zapytanie o pole rekordu - może to być zwracanie liczby, a nawet zmiennej systemowej. – ToolmakerSteve

2

Nawet Jest to stary temat, nie widzę tu dość prosty sposób ja używałem do takiego przypisania:

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

można przypisać bezpośrednio więcej zmiennych , nie tylko jeden, więc możesz całkowicie uniknąć używania tablic. Aby uzyskać szczegółowe informacje, zapoznaj się z funkcją php list().

0

To nie pozwala całkowicie uniknąć tablicy, ale rezygnuje z niej w jednym wierszu.

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