2012-02-12 7 views
6

jestem coraz to:Tablica pobierania MySQL dodaje zduplikowane wartości?

Array 
(
[0] => 1 
[id] => 1 
[1] => 778613c4344dbc9565c359c1154c6a18 
[session] => 778613c4344dbc9565c359c1154c6a18 
[2] => fn 
[first_name] => fn 
[3] => ln 
[last_name] => ln 
[4] => un 
[username] => un 
[5] => 016e6128e8ca9dda1b310c364d9b622c 
[password] => 016e6128e8ca9dda1b310c364d9b622c 
[6] => address 
[email] => address 
[7] => 100 
[permission] => 100 
[8] => 10 
[year_level] => 10 
[9] => 
[department] => 
[10] => Sample 
[campus] => Sample 
[11] => 0 
[logo_url] => 0 
) 

Po uruchomieniu tej

$user = mysql_fetch_array(mysql_query("SELECT session FROM users WHERE username='$cookie[username]' AND first_name='$cookie[first_name]' AND last_name='$cookie[last_name]' AND campus='$cookie[campus]' AND id='$cookie[id]'")) 

pomysłów, dlaczego to powiela w ten sposób? Dzięki

EDYCJA: Myślę, że klucz podstawowy to robi. Masz pomysł, jak to zatrzymać?

Odpowiedz

13

Jeśli nie zostanie określony typ wynik jako drugi parametr, mysql_fetch_array() domyślnie MYSQL_BOTH(cytując):

Korzystając MYSQL_BOTH (domyślny), dostaniesz tablicę z oba asocjacyjne i wskaźniki liczbowe.


Jeśli to nie to, co chcesz, musisz zdać drugi parametr do tej funkcji, aby wskazać, jaki rodzaj wyników chcesz.

Na przykład, aby uzyskać jedynie tablicę asocjacyjną z kolumnami nazw jako klucze:

$result = mysql_query("SELECT session FROM users WHERE username='$cookie[username]' AND first_name='$cookie[first_name]' AND last_name='$cookie[last_name]' AND campus='$cookie[campus]' AND id='$cookie[id]'"); 
$user = mysql_fetch_array($result, MYSQL_ASSOC); 


As sidenote:

  • Upewnij się, że uciekają zmienne wstrzyknięć w zapytaniu , aby zapobiec SQL Injections, używając na przykład mysql_real_escape_string()
  • Przed użyciem mysql_fetch_array() należy sprawdzić, czy mysql_query() powiodło się,
  • I, szczególnie w przypadku nowego projektu, należy używać mysqli lub PDO, a nie starych funkcji mysql_* - patrz Choosing an API.
+0

-1 za powtarzanie starych bzdur. ucieczka nie ma nic wspólnego z iniekcjami SQL, ale bezmyślne ucieczkowe "wartości" sprawią, że wstrzyknięcie stanie się całkiem możliwe. –

+0

Cóż, upewniając się, że dane wprowadzone do zapytań SQL są * bezpieczne *, mają związek z iniekcjami SQL; a ucieczkowe sznurki to sposób na upewnienie się, że są one * bezpieczne *; Mimo to, przyznaję, że mogłem dodać, że ten sam pomysł powinien być zastosowany dla wartości innych niż łańcuchowe, takich jak liczby całkowite * (upewniając się, że naprawdę zawierają liczby całkowite, na przykład z 'intval()') * –

+0

znowu stare złudzenie. escaping nie czyni danych * "bezpiecznymi" *. to tylko formatowanie. I na pewno trzeba go używać (dla łańcuchów) nie dla jakiegokolwiek bezpieczeństwa, ale tylko po to, aby zachować spójność SQL.Liczba całkowita nie jest przypadkiem pojedynczym, identyfikator jest kolejnym przykładem kompletnej i kompletnej bezużyteczności ucieczki, która miała sprawić, że twoje "wartości" będą "bezpieczne". –

1

Spróbuj drugi parametr MYSQL_ASSOC lub MYSQL_NUM. Domyślnie MYSQL_BOTH jest domyślnie powracający z kluczami numerycznymi i polowymi.

1

Pascal MARTIN wyjaśnił już przyczynę.

Powiem ci, żebyś użył mysql_fetch_assoc To da ci tylko powiązaną tablicę. Część numeryczna nie będzie obecna.

Powiązane problemy