2012-03-31 51 views
19

Đây có lẽ là một điều dễ dàng để làm nhưng tôi là một nghiệp dư và những thứ chỉ không làm việc cho tôi.MySql php: kiểm tra nếu Row tồn tại

Tôi chỉ muốn kiểm tra và xem một hàng tồn tại nơi $ lectureName lãm. Nếu một hàng tồn tại với $ lectureName ở đâu đó trong nó, tôi muốn hàm trả về "được gán" nếu không thì nó sẽ trả về "có sẵn". Đây là những gì tôi có. Tôi khá chắc chắn một mớ hỗn độn của nó. Hãy giúp tôi.

function checkLectureStatus($lectureName) 
{ 
$con = connectvar(); 
mysql_select_db("mydatabase", $con); 
$result = mysql_query("SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName'"); 
    while($row = mysql_fetch_array($result)); 
    { 
    if (!$row[$lectureName] == $lectureName) 
    { 
     mysql_close($con); 
     return "Available"; 
    } 
     else 
    { 
     mysql_close($con); 
     return "Assigned"; 
    } 
} 

Khi tôi làm tất cả mọi thứ này trở lại có sẵn, ngay cả khi nó phải trả lại được giao.

+0

Vui lòng không nhập các truy vấn như vậy vì bạn có vấn đề về SQL injection. Điều này có nghĩa là kẻ tấn công có thể dễ dàng thao tác cơ sở dữ liệu của bạn (http://php.net/manual/de/security.database.sql-injection.php). Để tránh nó, hãy xem http://at2.php.net/manual/de/function.mysql-real-escape-string.php để biết một số ví dụ. –

+0

@Jasd Tại sao các trang bằng tiếng Đức? –

+1

Ahh xin lỗi, có vẻ như tôi đã sao chép liên kết sai, chỉ cần thay thế 'de' bằng 'vi' trong URL. –

Trả lời

18

này phải làm các trick: chỉ cần hạn chế kết quả để 1 hàng; nếu liên tiếp trở lại các $lectureNameAssigned, nếu không nó là sẵn.

function checkLectureStatus($lectureName) 
{ 
    $con = connectvar(); 
    mysql_select_db("mydatabase", $con); 
    $result = mysql_query(
     "SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName' LIMIT 1"); 

    if(mysql_fetch_array($result) !== false) 
     return 'Assigned'; 
    return 'Available'; 
} 
+9

định dạng khá kém –

+1

lol dấu ngoặc nhọn thêm cho người mới bắt đầu: P – quickshiftin

+0

Một điều khác xảy ra với tôi là nó sẽ là một ý tưởng tốt để đánh dấu cột 'lecture_name' là 'UNIQUE' nếu chỉ có một mục nhập cho mỗi tên bài giảng (có vẻ là mục đích). Điều này sẽ thực thi ý tưởng của hàm 'checkLectureStatus' ở cấp cơ sở dữ liệu, thay vì chỉ các thành phần của ứng dụng sử dụng phương thức này. – quickshiftin

30

Cách dễ nhất để kiểm tra xem một hàng tồn tại:

$lectureName = mysql_real_escape_string($lectureName); // SECURITY! 
$result = mysql_query("SELECT 1 FROM preditors_assigned WHERE lecture_name='$lectureName' LIMIT 1"); 
if (mysql_fetch_row($result)) { 
    return 'Assigned'; 
} else { 
    return 'Available'; 
} 

Không cần phải gây rối với mảng và tên trường.

+1

mysql_real_escape_string không có gì liên quan đến bảo mật. Tuy nhiên nó phải luôn luôn được sử dụng để thoát khỏi mọi chuỗi đưa vào truy vấn. Nhưng đó là cách sử dụng được giới hạn trong các chuỗi được trích dẫn chỉ –

+0

Chỉ cần FYI, mysql_fetch_row trả về một hàng duy nhất, do đó không cần cho LIMIT 1. – Vincent

2
$result = mysql_query("select if(exists (SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName'),'Assigned', 'Available')"); 
+1

Đây là một cách tiếp cận tốt nếu bạn là người ủng hộ việc triển khai logic ứng dụng ở cấp cơ sở dữ liệu; một bước đi từ thủ tục được lưu trữ nếu bạn hỏi tôi, nhưng một giải pháp hợp lệ dù sao. – quickshiftin

14

Sử dụng mysql_num_rows(), để kiểm tra xem hàng có sẵn hay không

$result = mysql_query("SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName' LIMIT 1"); 
$num_rows = mysql_num_rows($result); 

if ($num_rows > 0) { 
    // do something 
} 
else { 
    // do something else 
} 
+0

Trong khi đây là một cách tiếp cận vững chắc, tôi vẫn sẽ giới hạn kết quả thành 1 hàng cho hiệu năng tốt hơn w/db. Mặc dù không bao giờ 'nên' nhiều hơn một lần xuất hiện của '$ lectureName' nếu tôi thu thập ý định của OP một cách chính xác. – quickshiftin

+1

@quickshiftin, Đúng, thêm giới hạn cho câu trả lời. – Starx

1

Nếu bạn chỉ muốn so sánh chỉ có một hàng với $ lactureName sau đó sử dụng sau

function checkLectureStatus($lectureName) 
{ 
$con = connectvar(); 
mysql_select_db("mydatabase", $con); 
$result = mysql_query("SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName'"); 
    if(mysql_num_rows($result) > 0) 
    { 
     mysql_close($con); 
     return "Assigned"; 
    } 
    else 
    { 
     mysql_close($con); 
     return "Available"; 
    } 
} 
0
function checkLectureStatus($lectureName) { 
    global $con; 
    $lectureName = mysql_real_escape_string($lectureName); 
    $sql = "SELECT 1 FROM preditors_assigned WHERE lecture_name='$lectureName'"; 
    $result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql); 
    if (mysql_fetch_row($result)) { 
    return 'Assigned'; 
    } 
    return 'Available'; 
} 

tuy nhiên bạn phải sử dụng một số thư viện trừu tượng để truy cập cơ sở dữ liệu.
mã sẽ trở thành

function checkLectureStatus($lectureName) { 
    $res = db::getOne("SELECT 1 FROM preditors_assigned WHERE lecture_name=?",$lectureName); 
    if($res) { 
    return 'Assigned'; 
    } 
    return 'Available'; 
} 
+0

Đó là một số sử dụng không có dấu ngoặc nhọn trong các câu lệnh if., Và đó là một biến toàn cục mà tôi thấy ... Sự thấu hiểu chính trên lớp trừu tượng db. – quickshiftin

+0

Không có gì sai với các biến toàn cục nếu chúng được sử dụng đúng mục đích. Một nhà phát triển nên được hướng dẫn bởi tri thức, chứ không phải mê tín dị đoan. –

+0

LOL có vẻ như ai đó cảm thấy bị thương. Vì vậy, không có lĩnh vực cho cuộc thảo luận lành mạnh. Chúc một ngày tốt lành :) –

5

Chỉ cần một cập nhật nhỏ cho bưu chính, các câu trả lời: mysqli_query nên được sử dụng, không mysql_query.

mysqli_query

+2

Điều này sẽ được đăng dưới dạng nhận xét chứ không phải là câu trả lời. – nickhar

+3

Tại sao điều này nhận được hai upvotes? –

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