2012-03-31 16 views
19

यह संभवतः एक आसान काम है लेकिन मैं शौकिया हूं और चीजें सिर्फ मेरे लिए काम नहीं कर रही हैं।MySQL php: जांचें कि पंक्ति मौजूद है

मैं सिर्फ यह देखना चाहता हूं कि कोई पंक्ति मौजूद है या नहीं, जहां $ lectureName दिखाता है। यदि $ lecture के साथ कोई पंक्ति मौजूद है, तो कहीं भी, मैं चाहता हूं कि फ़ंक्शन "असाइन" वापस लौटाए, तो उसे "उपलब्ध" वापस नहीं करना चाहिए। मेरे पास यह है। मुझे यकीन है कि यह एक गड़बड़ है। कृपया मदद करे।

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"; 
    } 
} 

जब मैं ऐसा करता हूं तो सबकुछ वापस लौटाता है, भले ही इसे असाइन किया जाना चाहिए।

$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'; 
} 

सरणियों और फ़ील्ड नाम के साथ गड़बड़ करने के लिए कोई ज़रूरत नहीं है: यदि एक पंक्ति मौजूद है

+0

कृपया ऐसा क्वेरी लिखते नहीं है क्योंकि आप एसक्यूएल इंजेक्शन की समस्या है। इसका मतलब है कि एक हमलावर आसानी से आपके डेटाबेस (http://php.net/manual/de/security.database.sql-injection.php) में हेरफेर कर सकता है। इससे बचने के लिए कुछ उदाहरणों के लिए http://at2.php.net/manual/de/function.mysql-real-escape-string.php देखें। –

+0

@Jasd जर्मन में पृष्ठ क्यों हैं? –

+1

आह क्षमा करें, ऐसा लगता है कि मैंने गलत लिंक कॉपी किए हैं, बस यूआरएल के भीतर 'डी' के साथ 'डी' को प्रतिस्थापित करें। –

उत्तर

18

यह चाल करना चाहिए: परिणाम को केवल 1 पंक्ति तक सीमित करें; यदि कोई पंक्ति वापस आती है $lectureName असाइन किया गया है, अन्यथा यह उपलब्ध है।

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

काफी खराब स्वरूपण –

+1

लॉल अतिरिक्त घुंघराले ब्रेसिज़ शुरुआती के लिए हैं: पी – quickshiftin

+0

मेरे साथ एक और चीज है 'lecture_name' कॉलम को 'अद्वितीय' के रूप में चिह्नित करने का एक अच्छा विचार होगा यदि केवल प्रति व्याख्यान नाम (जो इरादा प्रतीत होता है) में एक प्रविष्टि होना चाहिए। यह इस विधि का उपयोग करने वाले एप्लिकेशन के घटकों के बजाय डेटाबेस स्तर पर 'चेकलेक्चरस्टैटस' फ़ंक्शन के विचार को लागू करेगा। – quickshiftin

30

सबसे आसान तरीका है की जाँच करने के।

+1

mysql_real_escape_string के पास सुरक्षा के साथ कुछ लेना देना नहीं है। फिर भी इसे हमेशा पूछे जाने वाले प्रत्येक स्ट्रिंग से बचने के लिए उपयोग किया जाना चाहिए। लेकिन इसका उपयोग उद्धृत तारों तक सीमित है केवल –

+0

बस एफवाईआई, mysql_fetch_row एक पंक्ति देता है, इस प्रकार LIMIT के लिए कोई आवश्यकता नहीं है। – Vincent

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

यह एक अच्छा तरीका है यदि आप डेटाबेस स्तर पर अनुप्रयोग तर्क लागू करने के वकील हैं; यदि आप मुझसे पूछें तो संग्रहित प्रक्रियाओं से एक कदम दूर, लेकिन फिर भी एक वैध समाधान। – quickshiftin

14

उपयोग mysql_num_rows(), अगर पंक्तियों उपलब्ध हैं की जाँच करें या नहीं

$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

हालांकि यह एक ठोस दृष्टिकोण है, फिर भी मैं बेहतर प्रदर्शन w/डीबी के लिए परिणाम को 1 पंक्ति तक सीमित कर दूंगा। यद्यपि मैं ओपी के इरादे को सही तरीके से इकट्ठा करता हूं, हालांकि 'लेक्चरनाम' की एक से अधिक घटनाएं कभी नहीं होनी चाहिए। – quickshiftin

+1

@quickshiftin, सही, उत्तर में सीमा जोड़ा गया। – Starx

1

तुम सिर्फ उसके बाद निम्न का उपयोग $ lactureName के साथ केवल एक पंक्ति की तुलना करना चाहते हैं के लिए

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'; 
} 

हालांकि आपको कुछ अमूर्त पुस्तकालय का उपयोग करना है डेटाबेस पहुंच के लिए। mysqli_query इस्तेमाल किया जाना चाहिए, नहीं mysql_query:
कोड बस पोस्ट और जवाब के लिए एक छोटे से अद्यतन हो जाएगा

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

बयान में उन लोगों में घुंघराले ब्रेसिज़ का कुछ अनावश्यक उपयोग है। और यह एक वैश्विक चर है जो मैं देखता हूं ... डीबी अबास्ट्रक्शन परत पर प्रमुख अंतर्दृष्टि .. – quickshiftin

+0

यदि वे उद्देश्य पर उपयोग किए गए वैश्विक चर के साथ कुछ भी गलत नहीं है। एक डेवलपर को ज्ञान द्वारा निर्देशित किया जाना चाहिए, अंधविश्वास नहीं। –

+0

एलओएल ऐसा लगता है कि कोई घायल महसूस करता है। तो साधु चर्चा के लिए कोई क्षेत्र नहीं है। एक अच्छा दिन है :) –

5
+2

इसे एक टिप्पणी के रूप में पोस्ट किया जाना चाहिए और उत्तर नहीं देना चाहिए। – nickhar

+3

यह दो अपवॉट क्यों मिला? –

संबंधित मुद्दे