2012-05-01 7 views
8

Ich möchte so etwas wie dies zu tun:Kann ich nur eine Spalte in MYSQL statt alle auswählen, um es schneller zu machen?

$query=mysql_query("SELECT userid FROM users WHERE username='$username'"); 
$the_user_id= ..... 

Weil alles, was ich will, ist die Benutzer-ID, die mit dem Benutzernamen entspricht.

Die übliche Art und Weise, dass sein würde:

$query=mysql_query("SELECT * FROM users WHERE username='$username'"); 
while ($row = mysql_fetch_assoc($query)) 
    $the_user_id= $row['userid']; 

Aber es ist etwas effizienter, dass dies? Vielen Dank, grüße

+0

Wählen Sie nur, was Sie brauchen, ist eine gute Übung. Haben Sie irgendwelche besonderen Probleme damit? – zerkms

+0

http://stackoverflow.com/questions/811153/php-simple-way-to-read-single-record-from-mysql –

+0

Hallo, ich weiß eigentlich nicht, wie man die zweite Zeile, das heißt, zu erklären eine Variable und weisen Sie ihr das Ergebnis der Abfrage zu. – eric01

Antwort

13

Sie haben den Nagel direkt auf den Kopf getroffen: was Sie tun möchten, ist SELECT userid FROM users WHERE username='$username'. Probieren Sie es aus - es wird funktionieren :)

SELECT * ist fast immer eine schlechte Idee; Es ist viel besser, die Namen der Spalten anzugeben, die MySQL zurückgeben soll. Natürlich müssen Sie immer noch mysql_fetch_assoc oder etwas ähnliches verwenden, um die Daten tatsächlich in eine PHP-Variable zu bringen, aber zumindest spart dies MySQL den Aufwand, alle diese Spalten zu versenden, die Sie sowieso nicht verwenden werden.

Als Nebenbemerkung möchten Sie vielleicht stattdessen die neuere mysqli-Bibliothek oder das PDO verwenden. Diese sind auch viel effizienter als die alte mysql-Bibliothek, die veraltet ist.

+0

Hallo, vielen Dank für Ihre Antwort. Aber mein Problem ist, ich weiß nicht, wie man diesen einen Wert der Variablendeklaration '$ the_user_id = ... 'zuweist. Grüße – eric01

+1

Sie müssen immer noch den Code verwenden, den Sie bereits geschrieben haben, indem Sie' mysql_fetch_asoc'; Durch das Vermeiden dieses 'SELECT *' wird MySQL nur sehr viel Aufwand eingespart, da es das Senden von Daten vermeiden kann, die Sie nicht verwenden. – Daan

+0

Danke für Ihre Erklärung. Ich lese über PDO's. Grüße – eric01

3

Der "übliche" Weg ist nur wählen Sie die Spalten, die Sie benötigen.

Jede Spalte, die Teil der Auswahl ist und nicht benötigt wird, verlangsamt den Abruf. Teilweise aufgrund des Netzwerkverkehrs und teilweise weil die Datenbank-Engine bestimmte Optimierungen anwenden kann, wenn nur einige Spalten ausgewählt sind.

Und select * ist normalerweise in Produktionscode verpönt.

3

Ihre Anfrage korrekt ist:

$query = mysql_query("SELECT userid FROM users WHERE username='$username'"); 

Dies wird funktionieren, wenn richtig getan. Beachten Sie, dass $username korrekt mit mysql_real_escape_string maskiert werden muss. Ich würde empfehlen, auf parametrisierte Abfragen zu schauen, um das Risiko der Einführung einer Unverwundbarkeit durch SQL-Injection zu reduzieren.

Eine andere Sache, die Sie ändern können, ist mysql_result statt der Schleife zu verwenden:

$the_user_id = mysql_result($result, 0); 

Dies setzt voraus, dass wissen Sie nur eine Reihe zu bekommen.

3

Nicht nur können Sie, aber Sie sollten. Leider haben zu viele junge Entwickler die Angewohnheit, viel zu viele Daten auszuwählen. Sobald Sie Ihre Abfrage ausführen, müssen Sie keine While-Schleife mehr ausführen, da nur ein Datensatz zurückkommt. Verwenden Sie stattdessen nur die folgenden:

$sql = sprintf("SELECT userid FROM users WHERE username = '%s'", $username); 
$result = mysql_query($sql) or die(mysql_error()); 
$data = mysql_result($result, 0); 

if ($data) echo $data; // first userid returned 

Der zweite Parameter von mysql_result() ist der Zeilenindex Sie möchten abzurufen. 0 ist zuerst.

1

Ja, das ist eine großartige Optimierungspraxis!

Auch, wenn Sie einen Schritt weiter gehen wollen und machen es super-optimiert, versuchen, eine LIMIT Zugabe, wie folgt aus: $query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");

Dies ist natürlich vorausgesetzt, dass Sie nur eine Benutzer-ID erwarten werden zurückgeführt und wird Lassen Sie die Datenbank-Engine anhalten, sobald sie gefunden wird.

Aber das Wichtigste: IMMER ENTWICKELN/SANITIEREN SIE IHRE EINGANGSDATEN! (Kann nicht diese gut genug betonen)

0

Sie können dies mit einer einzigen Codezeile

echo array_values(mysqli_fetch_array($mysqli->query("SELECT name FROM user WHERE id='$userid'")))[0]; 

Sie mit der Datenbank verbinden müssen, wie unten dargestellt, bevor Sie dieses

$mysqli = new mysqli('HOST', 'USERNAME', 'PASSWORD', 'DATABASE'); 

Credits @samuel t thomas

Verwandte Themen