mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows आदि ... पैरामीटर 1 के संसाधन होने की अपेक्षा करता है


960

मैं एक MySQL तालिका से डेटा का चयन करने की कोशिश कर रहा हूं, लेकिन मुझे निम्नलिखित त्रुटि संदेशों में से एक मिलता है:

mysql_fetch_array () संसाधन 1, संसाधन बूलियन दिए जाने की अपेक्षा करता है

यह मेरा कोड है:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

while($row = mysql_fetch_array($result)) {
    echo $row['FirstName'];
}

15
आप अधिक उपयोगी eroor msg का उपयोग कर सकते हैं :: QUERY or die (mysql_error ());
निक

123
इसके अलावा अनिवार्य नोट: आपका कोड SQL इंजेक्शन के लिए प्रवण है । आपको उपयोगकर्ता इनपुट को मान्य और / या बचाना चाहिए। एक नजर है mysql_real_escape_stringउपयोगकर्ता डेटा पर कभी भरोसा न करें।
फेलिक्स क्लिंग

7
दरअसल, ओपी कोड MySQL सर्वर पर एक वाक्यविन्यास त्रुटि का कारण होगा, लेकिन कम से कम यह SQL इंजेक्शन के लिए असुरक्षित नहीं है क्योंकि एकल उद्धरण में परिवर्तनशील प्रक्षेप नहीं है।
१४:४२ पर szgal

4
@FelixKling मुझे एहसास है कि यह बहुत पुराना है, और संभवत: उस समय सबसे सटीक संभव है, लेकिन आपकी टिप्पणी अब एक तरह से खतरनाक रूप से गलत है: mysql_real_escape_stringSQL इंजेक्शन सुरक्षा के सभी-और अंत नहीं है; यह अभी भी कई हमलों की चपेट में है। (नहीं, आपने कभी नहीं कहा कि यह बिल्कुल सही है, लेकिन आपको लगा कि यह एकमात्र आवश्यक समाधान था) अब तक का सबसे अच्छा समाधान पीडीओ है, जहां तक ​​मुझे पता है।
निधि मोनिका का मुकदमा

2
गाह। MySQLi और PDO को शामिल करने के लिए इस प्रश्न का विस्तार करना एक बुरा विचार था। वे प्रत्येक के अपने अलग-अलग वाक्यविन्यास और त्रुटि संदेश हैं और वे पूरी तरह से अच्छी तरह से अपने प्रश्न कर सकते थे। एक विशाल तीन-भाग वाले प्रश्न में सब कुछ मिलाकर यह कम Googleable बनाता है और उन लोगों को मजबूर करता है जो अप्रासंगिक सामग्री के माध्यम से यहां पहुंचने के लिए मजबूर होते हैं कि वे क्या चाहते हैं। यह नीचे दिए गए बहुत सारे उत्तरों को अमान्य कर दिया गया है, और सामान्य रूप से हमारे द्वारा लागू किए गए मानकों से यह प्रश्न "टू ब्रॉड" बनाता है। यह मेरी राय में एक गड़बड़ है, लेकिन इसे ठीक करने के लिए बहुत देर हो चुकी है।
मार्क अमेरी

जवाबों:


667

एक क्वेरी विभिन्न कारणों से विफल हो सकती है जिस स्थिति में mysql_ * और mysqli एक्सटेंशन दोनों falseअपने संबंधित क्वेरी फ़ंक्शन / विधियों से वापस आ जाएंगे । आपको उस त्रुटि स्थिति के लिए परीक्षण करने और तदनुसार उसे संभालने की आवश्यकता है।

mysql_ * एक्सटेंशन :

नोट mysql_ कार्यों का बहिष्कार कर रहे हैं और php संस्करण 7 में हटा दिया गया है।

$resultइसे पास करने से पहले जांच लें mysql_fetch_array। आप पाएंगे कि ऐसा falseइसलिए है क्योंकि क्वेरी विफल हो गई है। mysql_queryसंभावित रिटर्न मूल्यों और उनसे निपटने के तरीके के लिए सुझाव देखें ।

$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

mysqli विस्तार
प्रक्रियात्मक शैली :

$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");

// mysqli_query returns false if something went wrong with the query
if($result === FALSE) { 
    yourErrorHandler(mysqli_error($mysqli));
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
        ...

ऊँ-शैली :

$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

तैयार कथन का उपयोग करना:

$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
    $result = $stmt->get_result();
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

ये उदाहरण केवल यह दर्शाते हैं कि क्या किया जाना चाहिए (त्रुटि से निपटने), यह कैसे करना है। or dieHTML को आउटपुट करते समय उत्पादन कोड का उपयोग नहीं करना चाहिए , अन्यथा यह (बहुत कम से कम) अमान्य HTML उत्पन्न करेगा। डेटाबेस त्रुटि संदेशों को गैर-व्यवस्थापक उपयोगकर्ताओं को प्रदर्शित नहीं किया जाना चाहिए, क्योंकि यह बहुत अधिक जानकारी का खुलासा करता है


9
ठीक है, लेकिन यदि क्वेरी विफल हो जाती है तो डाई () का उपयोग करना थोड़ा अधिक है।
2ndkauboy

28
मैं ओपी के लिए एक संपूर्ण त्रुटि हैंडलिंग तंत्र डिजाइन करने जा रहा था, लेकिन यह तय किया कि मेरे उत्तर के दायरे से परे हो सकता है।
एडवर्ड डेल

@ scompt.com हाँ यह कई अन्य उत्तरों में भी शामिल है। मुझे लगता है कि मैं सिर्फ इस बात को बना रहा था कि चूंकि यह भविष्य में त्रुटियों को ठीक से पकड़ने के तरीके (उत्कृष्ट) के अलावा एक उच्च दृश्यता प्रश्न पर स्वीकृत उत्तर है, यह वास्तव में विशिष्ट प्रश्न का जवाब देना चाहिए (यानी समझाएं कि इस मामले में त्रुटि क्यों है )।
24

2
इसके बजाय if($result === FALSE)आप उपयोग कर सकते हैं if(! $result)। अगर मैं गलत हूं तो मुझे
सुधारो

1
mysql_query (): mysql एक्सटेंशन को हटा दिया गया है और भविष्य में हटा दिया जाएगा: mysqli का उपयोग करें
ग्रेग

165

यह त्रुटि संदेश तब दिखाया जाता है जब आपके पास अपनी क्वेरी में कोई त्रुटि होती है जिसके कारण यह विफल हो जाता है। उपयोग करते समय यह स्वयं प्रकट होगा:

  • mysql_fetch_array/mysqli_fetch_array()
  • mysql_fetch_assoc()/mysqli_fetch_assoc()
  • mysql_num_rows()/mysqli_num_rows()

ध्यान दें : यह त्रुटि प्रकट नहीं होती है यदि आपकी क्वेरी से कोई पंक्तियाँ प्रभावित नहीं होती हैं। अमान्य सिंटैक्स वाली क्वेरी ही यह त्रुटि उत्पन्न करेगी।

समस्या निवारण कदम

  • सुनिश्चित करें कि आपके पास सभी त्रुटियों को प्रदर्शित करने के लिए आपका विकास सर्वर कॉन्फ़िगर है। आप इसे अपनी फ़ाइलों के शीर्ष पर या अपनी कॉन्फ़िग फ़ाइल में रखकर कर सकते हैं:error_reporting(-1); :। यदि आपके पास कोई सिंटैक्स त्रुटियां हैं, तो यह उन्हें आपको इंगित करेगा।

  • उपयोग mysql_error()mysql_error()आपकी क्वेरी करते समय MySQL को हुई किसी भी त्रुटि की रिपोर्ट करेगा।

    नमूना उपयोग:

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
  • MySQL कमांड लाइन या phpMyAdmin जैसे टूल से अपनी क्वेरी चलाएँ । यदि आपको अपनी क्वेरी में एक सिंटैक्स त्रुटि है, तो यह आपको बताएगा कि यह क्या है।

  • सुनिश्चित करें कि आपके उद्धरण सही हैं। क्वेरी या मान के आस-पास एक अनुपलब्ध उद्धरण क्वेरी को विफल करने का कारण बन सकता है।

  • सुनिश्चित करें कि आप अपने मूल्यों से बच रहे हैं। आपकी क्वेरी के उद्धरण क्वेरी को विफल कर सकते हैं (और आपको SQL इंजेक्शन के लिए खुला भी छोड़ सकते हैं)। उपयोगmysql_real_escape_string()अपने इनपुट से बचने के लिए ।

  • सुनिश्चित करें कि आप मिश्रण mysqli_*और mysql_*कार्य नहीं कर रहे हैं । वे एक ही चीज नहीं हैं और एक साथ उपयोग नहीं किए जा सकते हैं। (यदि आप एक या दूसरी छड़ी को चुनने जा रहे हैं तो mysqli_*नीचे देखें। क्यों?)

अन्य टिप्स

mysql_*नए कोड के लिए फ़ंक्शन का उपयोग नहीं किया जाना चाहिए। उनका अब रखरखाव नहीं किया गया है और समुदाय ने पदावनति प्रक्रिया शुरू कर दी है । इसके बजाय आपको तैयार बयानों के बारे में सीखना चाहिए और PDO या MySQLi का उपयोग करना चाहिए । यदि आप तय नहीं कर सकते, तो यह लेख चुनने में मदद करेगा। यदि आप सीखने की परवाह करते हैं, तो यहां अच्छा पीडीओ ट्यूटोरियल है


1
इस प्रश्न को देखते हुए आज stackoverflow.com/q/43804651/1415724 और अन्य समान हाल ही में; मुझे लगता है कि आपके उत्तर को अपडेट करने के लिए यह सार्थक हो सकता है कि "mysql_query()mysqli_query($connection) कुछ त्रुटि हो सकती है जैसे कि क्वेरी / आदि को निष्पादित नहीं करने के कारण भी त्रुटि हो सकती है ।" ; विचार? चूंकि इस प्रश्नोत्तर में अन्य कोई उत्तर नहीं दिया गया है।
फंक

111

यहाँ त्रुटि एकल उद्धरण ( ') के उपयोग के कारण हुई । आप अपनी क्वेरी इस तरह से डाल सकते हैं:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

यह mysql_real_escape_stringSQL इंजेक्शन की रोकथाम के लिए उपयोग कर रहा है। हालांकि हमें PHP (PHP 5.5.0 और बाद के संस्करण) के उन्नत संस्करण के लिए MySQLi या PDO_MYSQL एक्सटेंशन का उपयोग करना चाहिए, लेकिन पुराने संस्करणों के mysql_real_escape_stringलिए चाल चलेगी ।


5
केवल क्वेरी स्ट्रिंग में वेरिएबल डालने के बजाय स्ट्रिंग के संगति के साथ शोर क्यों जोड़ा जा रहा है?
मत्तो रीवा

1
@ मत्तेयो रीवा हाँ, लेकिन मैंने सोचा कि यह स्ट्रिंग से अलग चर को साफ करने का एक छोटा तरीका है। :)
नीक

60

जैसा कि scompt.com ने बताया , क्वेरी विफल हो सकती है। क्वेरी या सही परिणाम प्राप्त करने के लिए इस कोड का उपयोग करें:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

अधिक जानकारी के लिए प्रलेखनmysql_query() देखें ।

वास्तविक त्रुटि एकल उद्धरण थी ताकि चर $usernameको पार्स नहीं किया गया था। लेकिन आपको mysql_real_escape_string($username)SQL इंजेक्शन से बचने के लिए वास्तव में उपयोग करना चाहिए ।


52

भावों को चारों ओर रखो $username। संख्यात्मक मूल्यों के विपरीत स्ट्रिंग मान, उद्धरणों में संलग्न होना चाहिए।

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

इसके अलावा, LIKEयदि आप वाइल्डकार्ड का उपयोग नहीं कर रहे हैं तो इस स्थिति का उपयोग करने का कोई मतलब नहीं है: यदि आपको =इसके बजाय एक सटीक मिलान उपयोग की आवश्यकता है LIKE


1
और क्या होगा अगर $ उपयोगकर्ता नाम है: "'; DROP TABLES;" ? यह तैयार कथनों और बाध्य मूल्यों का उपयोग करने के लिए लाभ है, जो मुझे लगता है कि पूछने वाले को बनाए रखना चाहते हैं।
होल्डऑफहंगर

42

कृपया चयनित डेटाबेस को एक बार जांचें क्योंकि कुछ समय डेटाबेस चयनित नहीं है

चेक

mysql_select_db('database name ')or DIE('Database name is not available!');

MySQL क्वेरी से पहले और फिर अगले चरण पर जाएं

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

f($result === FALSE) {
    die(mysql_error());

40

आपका कोड कुछ इस तरह होना चाहिए

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

एक बार उसके साथ करने के बाद, आपको स्क्रीन पर छपी हुई क्वेरी मिल जाएगी। इस क्वेरी को अपने सर्वर पर आज़माएँ और देखें कि क्या यह वांछित परिणाम देता है। अधिकांश समय त्रुटि क्वेरी में होती है। बाकी कोड सही है।


3
इस कोड का उपयोग न करें। यह SQL इंजेक्शन हमलों के लिए खुला है।
ब्राड

34
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

आप एकल उद्धरणों का उपयोग करके स्ट्रिंग को परिभाषित करते हैं और PHP एकल उद्धरण सीमांकित तारों को पार्स नहीं करता है। परिवर्तनीय प्रक्षेप प्राप्त करने के लिए आपको दोहरे उद्धरण या स्ट्रिंग संयोजन (या वहां एक संयोजन) का उपयोग करने की आवश्यकता होगी। अधिक जानकारी के लिए http://php.net/manual/en/language.types.string.php देखें ।

इसके अलावा, आपको यह देखना चाहिए कि mysql_query ने एक वैध परिणाम संसाधन लौटाया, अन्यथा fetch_ *, num_rows, आदि परिणाम पर काम नहीं करेंगे क्योंकि परिणाम नहीं है! अर्थात:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

अधिक जानकारी के लिए http://us.php.net/manual/en/function.mysql-query.php


2
इस कोड का उपयोग न करें, भले ही आप उद्धरण जोड़ें। यह SQL इंजेक्शन हमलों के लिए खुला है।
ब्राड

33

इस क्वेरी को काम करना चाहिए:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

समस्या एकल उद्धरण है, इस प्रकार आपकी क्वेरी विफल हो जाती है और FALSE और आपका WHILE लूप निष्पादित नहीं कर सकता है। % का उपयोग करने से आप अपनी स्ट्रिंग (जैसे SomeText- $ username-SomeText) वाले किसी भी परिणाम से मेल खा सकते हैं।

यह केवल आपके प्रश्न का उत्तर है, आपको अन्य पदों में वर्णित सामान को लागू करना चाहिए: त्रुटि से निपटने, भागने के तार का उपयोग करें (उपयोगकर्ता फ़ील्ड में कुछ भी टाइप कर सकते हैं, और आपको यह सुनिश्चित करना होगा कि यह मनमाना कोड नहीं है), mysql_connect के बजाय PDO का उपयोग करें जो अब समाप्त हो गया है।


28
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

कभी-कभी क्वेरी को इस प्रकार दबा दिया जाता है @mysql_query(your query);


2
इस कोड का उपयोग न करें। यह SQL इंजेक्शन हमलों के लिए खुला है।
ब्राड

27

यदि आपने यहां सब कुछ करने की कोशिश की, और यह काम नहीं करता है, तो आप अपने MySQL डेटाबेस कोलाज की जांच करना चाहते हैं। मेरा एक स्वीडिश टकराव के लिए सेट किया गया था। फिर मैंने इसे बदल दिया utf8_general_ciऔर सब कुछ गियर में क्लिक किया।


25
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

WHERE क्वेरी का उपयोग करने के बजाय, आप इस ORDER BY क्वेरी का उपयोग कर सकते हैं। क्वेरी के उपयोग के लिए यह इससे कहीं बेहतर है।

मैंने यह क्वेरी की है और मुझे पैरामीटर या बूलियन जैसी कोई त्रुटि नहीं मिल रही है।


htmlspecialchars()HTML के संदर्भ में मनमाने डेटा का उपयोग करते समय उपयोग करना याद रखें । अन्यथा, आप मान्य HTML बनाते हैं जब आरक्षित वर्ण डेटा में उपयोग किए जाते हैं।
ब्राड

25

यह कोशिश करो, यह काम होना चाहिए, अन्यथा आपको अपनी समस्या को निर्दिष्ट करने के लिए त्रुटि को प्रिंट करने की आवश्यकता है

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

8
1) SQL इंजेक्शन के लिए व्यापक रूप से खुला, 2) में त्रुटि हैंडलिंग शामिल नहीं है जो ओपी के मामले में त्रुटि का कारण बन रहा है।
deceze

+1। @ डिसेज़ हां यह विस्तृत है। लेकिन ऐसा नहीं है कि ओपी या स्वीकार किए गए उत्तरदाता के कोड ;-) और यह ओपी के कोड में त्रुटि से निपटने में कमी का कारण नहीं है त्रुटि ... यह त्रुटि है , और यह उत्तर कम से कम हल करने का प्रयास करता है (एकल लगाकर) LIKEअभिव्यक्ति में स्ट्रिंग शाब्दिक के आसपास उद्धरण )।
सिपाही

1
+1 कृपया LIKE और '$ उपयोगकर्ता नाम' के बीच एक स्थान जोड़ें, बाकी SQL इंजेक्शन को छोड़कर ठीक प्रतीत होता है। क्यों नहीं = LIKE ऑपरेटर के बजाय उपयोगकर्तानाम बिल्कुल मेल खाना चाहिए
asim-ishaq

21

इसके दो कारण हो सकते हैं:

  1. क्या आपने mysql_query फ़ंक्शन को कॉल करने से पहले डेटाबेस से कनेक्शन खोला है? मुझे आपके कोड में वह नहीं दिख रहा है। क्वेरी बनाने से पहले mysql_connect का उपयोग करें। देखphp.net/manual/en/function.mysql-connect.php

  2. वैरिएबल $ उपयोगकर्ता नाम का उपयोग एकल उद्धरण स्ट्रिंग के अंदर किया जाता है, इसलिए इसके मूल्य का मूल्यांकन क्वेरी के अंदर नहीं किया जाएगा। क्वेरी निश्चित रूप से विफल हो जाएगी।

तीसरा, क्वेरी की संरचना SQL इंजेक्शन के लिए प्रवण है । इस सुरक्षा खतरे से बचने के लिए आप तैयार किए गए कथनों का उपयोग कर सकते हैं।


20

निम्नलिखित कोड का प्रयास करें। यह ठीक काम कर सकता है।

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

4
यह कोड SQL इंजेक्शन के अधीन है और इसका उपयोग नहीं किया जाना चाहिए।
ब्रैड

15

अपने पास जाओ config.php। मुझे भी यही समस्या थी। उपयोगकर्ता नाम और पासवर्ड को सत्यापित करें, और sql का चयन भी उसी नाम का है, जो कॉन्फिगर करता है।


15

उपयोग किए गए mysql_ * फ़ंक्शन का उपयोग न करें (php 5.5 में हटाए गए को php 7 में हटा दिया जाएगा)। और आप इसे mysqli के साथ बना सकते हैं या pdo के

यहाँ पूर्ण चयन क्वेरी है

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>

आपकी पोस्ट प्रश्न द्वारा संबोधित समस्याओं से नहीं निपटती है, जो कि एक अमान्य क्वेरी और गुप्त त्रुटि रिपोर्टिंग हैं। यह पोस्ट ऑफ टॉपिक है।
पॉल स्पीगल

14
<?php
    $username = $_POST['username'];
    $password = $_POST['password'];
    $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."'");

    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
?>

और अगर कोई यूनीक यूजर नेम है, तो आप उसके लिए "=" का उपयोग कर सकते हैं। पसंद करने की कोई जरूरत नहीं है।

आपकी क्वेरी होगी:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");

3
यह कोड SQL इंजेक्शन के लिए खुला है और इसका उपयोग नहीं किया जाना चाहिए।
ब्रैड

@AnujGarg यह कोड प्रत्यक्ष इनपुट लेता है और इसे क्वेरी में सम्मिलित करता है। कोई व्यक्ति पोस्ट डेटा के लिए अपनी SQL लिख सकता है usernameऔर इसे निष्पादित किया जाएगा।
ब्रैड

तो SQL इंजेक्शन से कोड को रोकने के लिए क्या उपयोग करें?
अनुज गर्ग

14

MySQL क्वेरी से पहले एक कनेक्शन स्ट्रिंग चर शामिल करें। उदाहरण के लिए, $conntइस कोड में:

$results = mysql_query($connt, "SELECT * FROM users");

1
यह सवाल में मुद्दों को संबोधित नहीं करता है। यह भी गलत है और एक और त्रुटि खड़ी करेगा।
पॉल स्पीगल

12

किसी भी समय आप ...

"चेतावनी: mysqli_fetch_object () पैरामीटर 1 को mysqli_result होने की उम्मीद है, बूल दी गई है"

... यह संभावना है क्योंकि आपकी क्वेरी के साथ कोई समस्या है। prepare()या query()हो सकता है वापसी FALSE(एक बूलियन), लेकिन यह सामान्य विफलता संदेश सुराग के रास्ते में ज्यादा आप नहीं छोड़ता। आपको कैसे पता चलेगा कि आपकी क्वेरी में क्या गलत है? तुम पूछते हो !

सबसे पहले, सुनिश्चित करें कि त्रुटि रिपोर्टिंग चालू है और दिखाई दे रही है: अपनी फ़ाइल खोलने के ठीक बाद इन दो पंक्तियों को अपनी फ़ाइल के शीर्ष पर जोड़ें <?php:

error_reporting(E_ALL);
ini_set('display_errors', 1);

यदि आपकी त्रुटि रिपोर्टिंग php.ini में सेट की गई है, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं होगी। बस सुनिश्चित करें कि आप त्रुटियों को इनायत से संभालते हैं और कभी भी अपने उपयोगकर्ताओं के लिए किसी भी समस्या का सही कारण नहीं बताते हैं। जनता को सही कारण बताना आपकी साइट और सर्वर को नुकसान पहुंचाने वालों के लिए एक सोने का उत्कीर्ण निमंत्रण हो सकता है। यदि आप ब्राउज़र में त्रुटियां नहीं भेजना चाहते हैं तो आप हमेशा अपने वेब सर्वर त्रुटि लॉग की निगरानी कर सकते हैं। लॉग लोकेशन सर्वर से सर्वर पर अलग-अलग होंगे, उदाहरण के लिए, उबंटू पर त्रुटि लॉग आमतौर पर स्थित होता है /var/log/apache2/error.log। यदि आप लिनक्स वातावरण में त्रुटि लॉग की जांच कर रहे हैं तो आप उपयोग कर सकते हैंtail -f /path/to/log त्रुटियों को देखने के लिए कंसोल विंडो में हैं क्योंकि वे वास्तविक समय में होते हैं .... या जैसा कि आप उन्हें देखते हैं।

एक बार जब आप मानक त्रुटि रिपोर्टिंग पर चुक जाते हैं, तो आपके डेटाबेस कनेक्शन और एरर जाँच पर एरर जाँचने से आपको होने वाली समस्याओं के बारे में और अधिक जानकारी मिल जाएगी। इस उदाहरण पर एक नज़र डालें जहां कॉलम नाम गलत है। सबसे पहले, कोड जो सामान्य घातक त्रुटि संदेश लौटाता है:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

त्रुटि सामान्य है और जो कुछ भी चल रहा है उसे सुलझाने में आपके लिए बहुत उपयोगी नहीं है।

कोड की अधिक पंक्तियों के एक जोड़े के साथ आप बहुत विस्तृत जानकारी प्राप्त कर सकते हैं जिसका उपयोग आप समस्या को तुरंत हल करने के लिए कर सकते हैं । prepare()सत्यता के लिए कथन की जाँच करें और यदि यह अच्छा है तो आप बाध्यकारी और निष्पादित करने के लिए आगे बढ़ सकते हैं।

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

यदि कुछ गलत है, तो आप एक त्रुटि संदेश भेज सकते हैं जो आपको सीधे मुद्दे पर ले जाता है। इस मामले में, वहाँ कोई नहीं हैfoo में, तालिका में स्तंभ , समस्या को हल करना तुच्छ है।

यदि आप चुनते हैं, तो आप इस चेकिंग को किसी फ़ंक्शन या क्लास में शामिल कर सकते हैं और पहले बताए अनुसार त्रुटियों को बेहतर तरीके से संभाल कर इसे बढ़ा सकते हैं।


2
आप कैसे लिख सकते हैं "बस सुनिश्चित करें कि आप त्रुटियों को इनायत से संभालते हैं और कभी भी अपने उपयोगकर्ताओं के लिए किसी भी मुद्दे का सही कारण नहीं बताते हैं।" और echo $error;एक पोस्ट में?
पॉल स्पीगेल

@PaulSpiegel ऊपर के लिए धन्यवाद। जब से मैंने उत्तर लिखा है या उत्तर दिया है, तब तक कुछ समय हो चुका है और मुझे याद है कि मैंने वहाँ प्रतिध्वनि छोड़ दी थी।
Jay Blanchard

11
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>

11

इसे इस्तेमाल करे

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}

4
@panjehra mysql_ * को अब समाप्त कर दिया गया है और इसे php 7 से हटा दिया जाएगा। Mysqli_ * का प्रयोग करें
मनोज कुमार

9

सबसे पहले, डेटाबेस के लिए अपना कनेक्शन जांचें। यह सफलतापूर्वक जुड़ा हुआ है या नहीं?

यदि यह हो गया, तो उसके बाद मैंने यह कोड लिखा है, और यह अच्छी तरह से काम करता है:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}

2
इस कोड का उपयोग न करें। यह SQL इंजेक्शन हमलों के लिए खुला है।
ब्राड

9

सुनिश्चित करें कि आप अपनी क्वेरी चलाने से पहले db_close () का उपयोग करके डेटाबेस को बंद नहीं कर रहे हैं:

यदि आप एक स्क्रिप्ट में कई प्रश्नों का उपयोग कर रहे हैं, यहां तक ​​कि आप अन्य पृष्ठों को भी शामिल कर रहे हैं जिसमें प्रश्न या डेटाबेस कनेक्शन शामिल हैं, तो यह संभव हो सकता है कि आप किसी भी स्थान पर db_close () का उपयोग करें जो आपके डेटाबेस कनेक्शन को बंद कर देगा ताकि आप सुनिश्चित हों अपनी लिपियों में यह गलती नहीं करना।


8

यदि आपके पास चेक करते समय कोई MySQL त्रुटि नहीं है, तो सुनिश्चित करें कि आपने अपना डेटाबेस टेबल ठीक से बनाया है। मेरे साथ ऐसा हुआ। किसी भी अवांछित अल्पविराम या उद्धरण के लिए देखें।


7

पहले अपना कनेक्शन जांचें।

फिर यदि आप डेटाबेस से सटीक मूल्य प्राप्त करना चाहते हैं तो आपको लिखना चाहिए:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

या आप LIKEमूल्य का प्रकार प्राप्त करना चाहते हैं तो आपको लिखना चाहिए:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");

3
यह कोड SQL इंजेक्शन के लिए खुला है और इसका उपयोग नहीं किया जाना चाहिए।
ब्रैड

6

आप यह भी देख सकते हैं $resultकि भ्रूण सरणी को निष्पादित करने से पहले, वैटर विफल हो रहा है

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}

3
इस कोड का उपयोग न करें। यह SQL इंजेक्शन हमलों के लिए खुला है।
ब्रैड

लेकिन अगर कोड काम करता है, तो मुझे लगता है कि आपको कोड को संपादित करना चाहिए और कोड को डालने के बजाय आवश्यक फिल्टर को इनपुट करना चाहिए।
user28864

फ़िल्टर का सरल उपयोग इस कोड के साथ क्या गलत है को ठीक नहीं करेगा। सबसे अच्छा समाधान पीडीओ या इसी तरह तैयार / पैरामीटर प्रश्नों का उपयोग करना है। मुझे इसे ठीक करने का कोई मतलब नहीं दिख रहा है, क्योंकि यहाँ पहले ही सही उत्तर पोस्ट किया जा चुका है। आदर्श रूप से, यह उत्तर हटा दिया जाएगा। हालाँकि, आपका उत्तर ठीक करने के लिए आपका स्वागत है और अगर यह सही है तो मैं इसे खुशी-खुशी वोट दूंगा।
ब्रैड

ठीक है, अगर आपको लगता है कि जवाब देने लायक नहीं है, तो आप आगे जाकर पढ़ सकते हैं। हालाँकि, मुझे लगा कि इस समुदाय का पूरा दृष्टिकोण ज्ञान को साझा करने और योगदान करने का है। यदि आपके पास लोगों को दिखाने और छोड़ने के बजाय साझा करने के लिए कुछ है।
user28864

2
आप सही हैं, इस समुदाय का संपूर्ण दृष्टिकोण ज्ञान को साझा करना है। इसलिए मेरे डाउनवोट के साथ स्पष्टीकरण जोड़ा गया, और आगे बताया गया कि आपका फ़िल्टर सुझाव पर्याप्त क्यों नहीं था। मैं आपको किसी अन्य व्यक्ति के साथ, जो आपका उत्तर ढूंढता है, को सचेत करना पसंद करूंगा, कि ऊपर दिया गया कोड असुरक्षित है। खराब कोड को हटाने के बजाय सभी के लिए सही तरीके सीखना बेहतर है। और, अगर मैं ऐसा करने का विकल्प चुनता हूं, तो मैं आपके जवाब को नहीं हटा सकता।
ब्रैड

4

आमतौर पर एक त्रुटि तब होती है जब आपका डेटाबेस कंसक्टिविटी विफल हो जाता है, इसलिए अपने डेटाबेस को कनेक्ट करना या डेटाबेस फ़ाइल को शामिल करना सुनिश्चित करें।

include_once(db_connetc.php');

या

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • सबसे अच्छा अभ्यास है कि क्वेरी को sqlyog में चलाएं और फिर इसे अपने पेज कोड में कॉपी करें।
  • हमेशा अपनी क्वेरी को एक चर में संग्रहीत करें और फिर उस चर को प्रतिध्वनित करें। फिर पास mysql_query($query_variable);

2
1) आपको नहीं पता कि मेरे पास किसी भी उत्तर पर वोट दिया गया है या नहीं। 2) जैसा कि मैंने अपनी पहली टिप्पणी में समझाया था; आपका जवाब समस्या का संदर्भ नहीं देता ( बूलियन mysql_fetch_array को दिया गया ) और आपके पास सिंटैक्स त्रुटियाँ हैं
Phil

2
आपके कोड उदाहरणों में आपके पास गलत उद्धरण हैं। सिंटेक्स हाइलाइटिंग आपके दूसरे कोड ब्लॉक पर लागू होता है, एक मृत दे-दूर है कि कुछ गलत है
फिल

4
यह कोड SQL इंजेक्शन के अधीन है और इसका उपयोग नहीं किया जाना चाहिए। @EngrZardari यदि आप अपने उत्पादन प्रणालियों पर इस कोड का उपयोग कर रहे हैं, तो आपको निस्संदेह हैक किया गया है और पीडीओ या इसी तरह के तैयार किए गए / पैरामीटर प्रश्नों का उपयोग करके स्थिति को खरीदने का उपाय करना चाहिए। ऐसी बॉट हैं जिनमें ऐसी कमजोरियों के लिए स्वचालित परीक्षण होता है।
ब्राड

1
@EngrZardari आपके बारे में "कोई त्रुटि नहीं है, मैं यहाँ कोड है जो मैं वर्तमान में उपयोग कर रहा हूँ चिपकाया है।" ऊपर टिप्पणी करें । क्वेरी में एक अनुपलब्ध उद्धरण था जिसे मैंने सही किया। वह (PHP) पार्स त्रुटि फेंक दिया होगा।
फंक फोर्टी निनेर

2

इस कोड की कोशिश करो यह ठीक काम करता है

वेरिएबल को पोस्ट वेरिएबल असाइन करें

   $username = $_POST['uname'];

   $password = $_POST['pass'];

  $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}

3
यह कोड SQL इंजेक्शन हमलों के अधीन है और इसका उपयोग नहीं किया जाना चाहिए।
ब्राड

1

चूँकि $ उपयोगकर्ता नाम एक php वैरिएबल है, इसलिए हमें इसे स्ट्रिंग के रूप में mysqli पर भेजना होगा, क्योंकि जब से क्वेरी u एक एकल उद्धरण के साथ शुरू हुई, हम दोहरे उद्धरण का उपयोग करेंगे, एकल उद्धरण और समापन प्रयोजनों के लिए एक फुलस्टॉप ("'। $ उपयोगकर्ता नाम)। '') यदि आपने दोहरे उद्धरण के साथ शुरुआत की है तो आप उद्धरणों को उलट देंगे ('' '' $ उपयोगकर्ता नाम '')।

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE "'.$username.'"');

while($row = mysql_fetch_array($result))
     {
      echo $row['FirstName'];
     }

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."' ");

while($row = mysql_fetch_array($result))
     {
      echo $row['FirstName'];
     }

लेकिन मैसकल के उपयोग ने बहुत अधिक मूल्यह्रास किया है, इसके बजाय पीडीओ का उपयोग करें। यह सरल लेकिन बहुत सुरक्षित है


लेकिन मैसकल का उपयोग कम हो गया है। आप इसके बजाय पीडीओ का उपयोग कर सकते हैं। मैं आपको एक नमूना लॉगिन देता हूं।
डेनिस किप्टुगेन

2
पासवर्ड को कभी भी सादे पाठ के रूप में संग्रहीत नहीं किया जाना चाहिए, इनका उपयोग फ़्यूकंटेशन में किया जाता है जो PHP के पास पासवर्ड के हैशिंग से निपटने और हैशेड पासवर्ड के सत्यापन के लिए होता है!
स्पेसफिनिक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.