2010-08-05 15 views
5

Mam mały problem, którego nie rozumiem. Mam db, który ma właściciela i typ (i więcej poza oczywiście). Chcę uzyskać listę wszystkich wartości typu, który ma właściciela równą bieżącego użytkownika, ale mam tylko dwa wynikutwórz tablicę z zapytania mysql php

$sql = "SELECT type FROM cars WHERE owner='".mysql_real_escape_string($_SESSION['username'])."' AND selling='0' ORDER BY id DESC "; 

$result = mysql_query($sql,$con); 

print_r(mysql_fetch_array($result)); 

drukuje:

Array ([0] => 18 [type] => 18) 

i

$sql = "SELECT type FROM cars WHERE owner='".mysql_real_escape_string($_SESSION['username'])."' AND selling='0' "; 

drukuje:

Array ([0] => 16 [type] => 16) 

A wynik powinien być podobny do 19, 19, 18, 17, 16 w tablicy. To wszystkie typy, które mają mnie jako właściciela.

mam tej pracy teraz:

for ($x = 0; $x < mysql_num_rows($result); $x++){ 
$row = mysql_fetch_assoc($result); 
echo $row['type']; 
} 

Tu wydrukować wszystkie wartości poprawnie, ale trzeba utworzyć tablicę ze wszystkimi wartościami. Chociaż mogłem użyć array_push, ale najlepiej jest zrobić to lepiej. Myślałem, że otrzymam wszystkie wartości typów za pomocą prostego zapytania mysql.

Odpowiedz

22

Bardzo często odbywa się to w while pętli:

$types = array(); 

while(($row = mysql_fetch_assoc($result))) { 
    $types[] = $row['type']; 
} 

spojrzeć w przykładach documentation.

W mysql_fetch_* metody będą zawsze uzyskać następny element zbioru wynikowego:

Zwraca tablicę ciągów, która odpowiada pobranemu wierszowi, lub FALSE jeśli nie ma więcej wierszy.

Dlatego właśnie działają pętle while. Jeśli nie ma już żadnych wierszy, to $row będzie false i istnieje pętla while.

Wydaje się tylko, że mysql_fetch_array dostaje więcej niż jeden wiersz, ponieważ domyślnie robi wynik jako normal and as associative value:

Korzystając MYSQL_BOTH (domyślny), dostaniesz tablicę z obu indeksów asocjacyjnych i numer .

Twój przykład pokazuje to najlepiej, masz taką samą wartość 18 i można uzyskać do niego dostęp za pośrednictwem $v[0] lub $v['type'].

2

Trzeba iterację ...

$typeArray = array(); 
$query = "select * from whatever"; 
$result = mysql_query($query); 

if ($result) { 
    while ($record = mysql_fetch_array($results)) $typeArray[] = $record['type']; 
} 
0
$type_array = array();  
while($row = mysql_fetch_assoc($result)) { 
    $type_array[] = $row['type']; 
} 
0
while($row = mysql_fetch_assoc($result)) { 
    echo $row['type']; 
} 
+0

Jego kod już to robi. Chce, żeby stała się tablicą. Echoing nie rozwiąże tego problemu. – Treffynnon

0

Można również ułatwić sobie życie przy użyciu opakowania, np.z ADODb:

$myarray=$db->GetCol("SELECT type FROM cars ". 
    "WHERE owner=? and selling=0", 
    array($_SESSION['username'])); 

Dobra okładka zrobi wszystko, co dla ciebie ucieknie, ułatwiając czytanie.

2
THE CORRECT WAY ************************ THE CORRECT WAY 

while($rows[] = mysqli_fetch_assoc($result)); 
array_pop($rows); // pop the last row off, which is an empty row 
+0

TAK! To jest PRAWIDŁOWY sposób. –

+0

Nie korzysta z mysqli, w którym używa starszej wersji mysql – DropHit

+2

Starsza wersja mysql? Musisz mieć na myśli przestarzałą Mysql. –

0

Możesz zajrzeć do artykułu SQL Injection na Wikipedii. Zajrzyj do części "Konwersja szesnastkowa", aby znaleźć małą funkcję do wykonywania poleceń SQL i zwróć tablicę z zawartymi w niej informacjami.

https://en.wikipedia.org/wiki/SQL_injection

napisałem funkcję dosql() bo znudziło mając moje polecenia SQL wykonującego wszędzie, zapominając sprawdzić błędy, i jest w stanie rejestrować wszystkie z moich poleceń w pliku dziennika do późniejszego oglądania, jeśli zajdzie taka potrzeba. Procedura jest bezpłatna dla każdego, kto chce jej użyć w dowolnym celu. Właściwie to rozszerzyłem tę funkcję, ponieważ chciałem, aby to zrobiło więcej, ale ta podstawowa funkcja jest dobrym punktem wyjścia do uzyskania danych wyjściowych z połączenia SQL.

Powiązane problemy