2012-05-01 16 views
8

tôi muốn làm một cái gì đó như thế này:Tôi có thể chỉ chọn một cột trong MYSQL thay vì tất cả, để làm cho nó nhanh hơn?

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

Bởi vì tất cả tôi muốn là ID người dùng tương ứng với tên người dùng.

Cách thông thường sẽ là:

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

Nhưng có một cái gì đó hiệu quả hơn mà điều này? Cảm ơn rất nhiều, liên quan đến số

+0

Chỉ chọn những gì bạn cần là một phương pháp hay. Bạn có bất kỳ vấn đề cụ thể với điều đó? – zerkms

+0

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

+0

Xin chào, tôi thực sự không biết cách thực hiện dòng thứ hai, nghĩa là, khai báo một biến và gán kết quả của truy vấn cho nó. – eric01

Trả lời

13

Bạn đã chạm vào móng tay ngay trên đầu: những gì bạn muốn làm là SELECT userid FROM users WHERE username='$username'. Hãy thử nó - nó sẽ hoạt động :)

SELECT * hầu như luôn là ý tưởng tồi; tốt hơn hết là chỉ định tên của các cột mà bạn muốn MySQL trả về. Tất nhiên, bạn sẽ cần phải sử dụng mysql_fetch_assoc hoặc một cái gì đó tương tự để thực sự nhận dữ liệu vào một biến PHP, nhưng ít nhất điều này giúp tiết kiệm chi phí cho việc gửi tất cả các cột này mà bạn sẽ không sử dụng.

Ngoài ra, bạn có thể muốn sử dụng thư viện mysqli mới hơn hoặc PDO thay thế. Chúng cũng hiệu quả hơn nhiều so với thư viện mysql cũ, vốn không được dùng nữa.

+0

Xin chào, cảm ơn bạn đã trả lời. Nhưng vấn đề của tôi là tôi không biết cách gán một giá trị đó cho khai báo biến '$ the_user_id = ...' Kính trọng – eric01

+1

Bạn vẫn cần sử dụng mã bạn đã viết bằng 'mysql_fetch_asoc'; tránh điều này 'SELECT *' chỉ đơn thuần là tiết kiệm rất nhiều chi phí cho MySQL vì nó có thể tránh việc gửi dữ liệu mà bạn sẽ không sử dụng. – Daan

+0

Cảm ơn bạn đã giải thích. Tôi đang đọc về PDO. Trân trọng – eric01

3

Cách "thông thường" là chỉ chọn các cột bạn cần.

Bất kỳ cột nào là một phần của lựa chọn và không cần thiết sẽ làm chậm quá trình truy xuất. Một phần vì lưu lượng mạng và một phần vì công cụ cơ sở dữ liệu có thể áp dụng tối ưu hóa nhất định nếu chỉ một số cột được chọn.

select * thường được cau mày trong mã sản xuất.

3

truy vấn của bạn là chính xác:

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

này sẽ làm việc nếu được thực hiện một cách chính xác. Lưu ý rằng $username phải được thoát đúng cách bằng mysql_real_escape_string. Tôi khuyên bạn nên xem xét các truy vấn được tham số hóa để giảm nguy cơ giới thiệu tính bất tử của SQL injection.

Một điều khác mà bạn có thể thay đổi là sử dụng mysql_result thay vì vòng lặp của bạn:

$the_user_id = mysql_result($result, 0); 

này giả định rằng biết bạn sẽ chỉ nhận được một hàng.

3

Không chỉ bạn có thể, nhưng bạn nên. Thật không may quá nhiều nhà phát triển trẻ có thói quen chọn quá nhiều dữ liệu. Khi bạn chạy truy vấn của mình, bạn không cần thực hiện một vòng lặp while vì bạn chỉ có một bản ghi quay lại. Thay vào đó, chỉ cần sử dụng các mục sau:

$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 

Tham số thứ hai là mysql_result() là chỉ mục hàng bạn muốn truy xuất. 0 là đầu tiên.

1

Vâng, đó là một thực tiễn tối ưu hóa tuyệt vời!

Ngoài ra, nếu bạn muốn đi một bước xa hơn và làm cho nó siêu tối ưu hóa, hãy thử thêm một LIMIT, như thế này: $query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");

này, tất nhiên, giả sử bạn mong đợi chỉ có một userid để được trả lại và sẽ làm cho cơ sở dữ liệu dừng lại khi nó tìm thấy nó.

Nhưng, điều quan trọng nhất: LUÔN LUÔN ESCAPE/XÁC ĐỊNH DỮ LIỆU INPUT CỦA BẠN! (Không thể căng thẳng này cũng đủ)

0

Bạn có thể làm điều này với một dòng mã

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

Bạn phải kết nối với cơ sở dữ liệu như hình dưới đây trước khi sử dụng này

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

Tín đến @samuel t thomas

Các vấn đề liên quan