mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows vb… parametre 1'in kaynak olmasını bekler


960

MySQL tablosundan veri seçmeye çalışıyorum, ancak aşağıdaki hata iletilerinden birini alıyorum:

mysql_fetch_array (), parametre 1'in boolean verilen kaynak olmasını bekler

Bu benim kodum:

$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
:: QUERY or die (mysql_error ()) kullanarak daha kullanışlı erozyon msj alabilirsiniz;
nik

123
Ayrıca zorunlu not: Kodunuz SQL enjeksiyonuna eğilimlidir . Kullanıcı girişini doğrulamalı ve / veya çıkış yapmalısınız. Bir bak mysql_real_escape_string. Kullanıcı verilerine asla güvenmeyin.
Felix Kling

7
Aslında OP'ın kod MySQL sunucusundaki bir sözdizimi hatası neden olur, ama en azından öyle değil tek tırnak değişken interpolasyon olmadığı için SQL Enjeksiyon karşı savunmasız.
szgal

4
@FelixKling Bunun çok eski ve muhtemelen mümkün olan en doğru olduğunu anlıyorum, ancak yorumunuz artık tehlikeli bir şekilde yanlış: mysql_real_escape_stringSQL enjeksiyon korumasının hepsi ve sonu değil; hala bazı saldırılara karşı savunmasız. (Hayır, asla mükemmel olduğunu söylemedin, ama bunun tek gerekli çözüm olduğunu ima ettin) Şimdi en iyi çözüm PDO, bildiğim kadarıyla.
Monica'nın Davası

2
Gah. Bu soruyu MySQLi ve PDO'yu içerecek şekilde genişletmek kötü bir fikirdi. Her birinin kendi biraz farklı sözdizimi ve hata mesajları var ve kendi soruları mükemmel olabilirdi. Her şeyi üç parçalı dev bir soruyla birleştirmek, bunu daha az Googleable yapar ve buraya gelen insanları alakasız içerikten geçmeye istediklerine ulaşmaya zorlar. Ayrıca, aşağıdaki yanıtların çoğunu geçersiz kılar ve bu soruyu normalde uyguladığımız standartlara göre "Çok Geniş" yapar. Bence bir karmaşa, ama şimdi düzeltmek için çok geç.
Mark Amery

Yanıtlar:


667

Bir sorgu çeşitli nedenlerle başarısız olabilir, bu durumda hem mysql_ * hem de mysqli uzantısı falseilgili sorgu işlevlerinden / yöntemlerinden geri döner . Bu hata durumunu test etmeniz ve uygun şekilde işlemeniz gerekir.

mysql_ * uzantısı :

NOT mysql_ fonksiyonlar artık yok ve php sürümüne 7'de kaldırılmıştır.

Geçmeden $resultönce kontrol edin mysql_fetch_array. falseSorgunun başarısız olmasının nedeni olduğunu göreceksiniz . mysql_queryOlası iade değerleri için belgelere ve bunlarla nasıl başa çıkılacağına dair önerilere bakın.

$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 uzatma
prosedürü tarzı :

$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 ) {
        ...

oo tarzı :

$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 ) {
      ...

hazırlanmış bir ifade kullanarak:

$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 ) {
      ...

Bu örnekler , nasıl yapılacağını değil, yalnızca ne yapılması gerektiğini gösterir (hata işleme). Üretim kodu or dieHTML çıktısını verirken kullanılmamalıdır , aksi takdirde (en azından) geçersiz HTML oluşturur. Ayrıca, veritabanı hata mesajları çok fazla bilgi ifşa ettiği için yönetici olmayan kullanıcılara gösterilmemelidir .


9
Doğru, ancak sorgu başarısız olursa die () kullanmak biraz fazladır.
2ndkauboy

28
OP için bütün bir hata işleme mekanizması tasarlayacaktım, ancak cevabımın kapsamı dışında olabileceğine karar verdim.
Edward Dale

@ scompt.com Evet, başka yanıtlar da içeriyor. Sanırım sadece bu, yüksek görünürlük sorusu için kabul edilen cevap olduğu için , gelecekte hataların nasıl düzgün bir şekilde yakalanacağına dair (mükemmel) tavsiyeye ek olarak, (IMHO) aslında belirli soruyu (yani bu durumda neden bir hata olduğunu açıklayın ).
Sepster

2
Bunun yerine if($result === FALSE)kullanabilirsiniz if(! $result). Yanılıyorsam beni düzelt
anestv

1
mysql_query (): mysql uzantısı kullanımdan kaldırıldı ve gelecekte kaldırılacak: kullan mysqli
Greg

165

Sorgunuzda başarısız olmasına neden olan bir hata olduğunda bu hata iletisi görüntülenir. Kullanırken kendini gösterecektir:

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

Not : Bu hata yok değil hiçbir satır Sorgunuzun etkilenen eğer görünür. Yalnızca geçersiz sözdizimi olan bir sorgu bu hatayı oluşturur.

Sorun Giderme Adımları

  • Geliştirme sunucunuzun tüm hataları gösterecek şekilde yapılandırıldığından emin olun. Eğer dosya üstündeki veya yapılandırma dosyasında bu koyarak bunu yapabilirsiniz: error_reporting(-1);. Herhangi bir sözdizimi hatası varsa, bunları size gösterecektir.

  • Kullanın mysql_error(). mysql_error()MySQL sorgunuzu gerçekleştirirken karşılaştığınız hataları bildirir.

    Örnek kullanım:

    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();
    }
    
  • Sorgunuzu MySQL komut satırından veya phpMyAdmin gibi bir araçtan çalıştırın . Sorgunuzda bir sözdizimi hatası varsa, bunun ne olduğunu size bildirirsiniz.

  • Fiyat tekliflerinizin doğru olduğundan emin olun. Sorgu veya değer çevresinde eksik bir tırnak sorgusunun başarısız olmasına neden olabilir.

  • Değerlerinizden kaçtığınızdan emin olun. Sorgunuzdaki tırnak işaretleri bir sorgunun başarısız olmasına neden olabilir (ve sizi SQL enjeksiyonlarına açık bırakabilir). Girişinizden mysql_real_escape_string()kaçmak için kullanın .

  • Karıştırmadığınızdan mysqli_*ve mysql_*işlevler yapmadığınızdan emin olun . Aynı şey değildirler ve birlikte kullanılamazlar. (Bunlardan birini veya diğerini seçecekseniz mysqli_*. Neden için aşağıya bakın.)

Diğer ipuçları

mysql_*fonksiyonlar yeni kod için kullanılmamalıdır. Artık korunmuyorlar ve topluluk, kullanımdan kaldırılma sürecini başlattı . Bunun yerine hazırlanan ifadeleri öğrenmeli ve PDO ya da MySQLi kullanmalısınız . Karar veremiyorsanız, bu makale seçiminize yardımcı olacaktır. Öğrenmeye özen gösterirseniz, burada iyi PDO öğreticisi var .


1
Bugün bu soru göz önüne alındığında, son zamanlarda stackoverflow.com/q/43804651/1415724 ve benzeri benzerleri göz önüne alındığında ; Cevabınızı "Bu hata, sorguyu mysql_query()/ mysqli_query($connection)vb. İle yürütmemenizden kaynaklanabilir" gibi bir şeyi içerecek şekilde güncellemenin faydalı olacağını düşünüyorum . ; düşünceler? Bu soru-cevap bölümünde başka hiçbir yanıttan bahsedilmediğinden.
Funk Forty Niner

111

Hata burada tek tırnak ( ') kullanıldığından kaynaklandı. Sorgunuzu şu şekilde koyabilirsiniz:

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

mysql_real_escape_stringSQL enjeksiyonunu önlemek için kullanıyor . Yine de PHP'nin yükseltilmiş sürümü (PHP 5.5.0 ve üstü) için MySQLi veya PDO_MYSQL uzantısını kullanmalıyız, ancak eski sürümler mysql_real_escape_stringiçin hile yapacağız.


5
Neden değişkeni sorgu dizesine koymak yerine dize birleştirme ile gürültü eklemelisiniz?
Matteo Riva

1
@Matteo Riva Evet, ama değişkenleri dizgiden ayırmanın daha temiz bir yolu olduğunu düşündüm. :)
nik

60

Gibi scompt.com açıkladı , sorgu başarısız olabilir. Sorgunun hatasını veya doğru sonucu almak için bu kodu kullanın:

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

Daha fazla bilgi için belgeleremysql_query() bakın .

Asıl hata, değişkenin $usernameayrıştırılmaması için tek tırnaktır. Ancak mysql_real_escape_string($username)SQL enjeksiyonlarından kaçınmak için gerçekten kullanmalısınız .


52

Tırnak işaretleri koy $username. Dize değerleri, sayısal değerlerin aksine, tırnak işaretleri içine alınmalıdır.

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

Ayrıca, LIKEjoker karakterler kullanmıyorsanız koşulu kullanmanın bir anlamı yoktur : =bunun yerine tam bir eşleşme kullanımına ihtiyacınız varsa LIKE.


1
Peki ya $ username: "'; DROP TABLES;" ? Bu, askerin tutmak isteyeceğini düşündüğüm hazırlanmış ifadeleri ve sınır değerleri kullanmanın avantajı.
HoldOffHunger

42

Lütfen veritabanı seçilmediğinde kontrol edin, çünkü bazı zamanlarda veritabanı seçilmez

Kontrol

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

MySQL sorgusundan önce ve sonraki adıma geçin

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

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

40

Kodunuz böyle bir şey olmalı

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

Bunu yaptıktan sonra, sorguyu ekrana yazdırırsınız. Sunucunuzda bu sorguyu deneyin ve istenen sonuçları üretip üretmediğine bakın. Çoğu zaman hata sorgudadır. Kodun geri kalanı doğrudur.


3
Bu kodu kullanmayın. SQL enjeksiyon saldırılarına açıktır.
Brad

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

Dizeyi tek tırnak işareti kullanarak tanımlarsınız ve PHP tek tırnakla ayrılmış dizeleri ayrıştırmaz. Değişken enterpolasyon elde etmek için çift tırnak veya OR dizesi birleştirme (veya bunların bir kombinasyonu) kullanmanız gerekir. Daha fazla bilgi için http://php.net/manual/en/language.types.string.php adresine bakın .

Ayrıca mysql_query geçerli bir sonuç kaynağı döndürdüğünü kontrol etmelisiniz, aksi takdirde fetch_ *, num_rows vb. Sonuç olarak sonuç üzerinde çalışmaz! IE:

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

Daha fazla bilgi için http://us.php.net/manual/en/function.mysql-query.php .


2
Tırnak ekleseniz bile bu kodu kullanmayın. SQL enjeksiyon saldırılarına açıktır.
Brad

33

Bu sorgu çalışmalıdır:

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

Sorun tek tırnaktır, bu nedenle sorgunuz başarısız olur ve YANLIŞ döndürür ve WHILE döngünüz yürütülemez. % Kullanmak, dizenizi içeren tüm sonuçları eşleştirmenize olanak tanır (SomeText- $ username-SomeText gibi).

Bu sadece sorunuzun bir cevabıdır, diğer yazılarda belirtilen şeyleri uygulamalısınız: hata işleme, kaçış dizeleri kullanın (kullanıcılar alana herhangi bir şey yazabilir ve rastgele kod olmadığından emin olmalısınız), mysql_connect yerine PDO kullanın ve şimdi depricated.


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

Bazen sorguyu @mysql_query(your query);


2
Bu kodu kullanmayın. SQL enjeksiyon saldırılarına açıktır.
Brad

27

Burada her şeyi denediyseniz ve çalışmazsa, MySQL veritabanı harmanlama kontrol etmek isteyebilirsiniz. Benimki İsveççe bir harmanlamaya ayarlanmıştı. Sonra onu değiştirdim utf8_general_cive her şey vitese tıkladı.


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 sorgusu kullanmak yerine, bu ORDER BY sorgusunu kullanabilirsiniz. Sorgu kullanmak için bundan çok daha iyi.

Bu sorguyu yaptım ve parametre veya boole gibi hiçbir hata alıyorum.


htmlspecialchars()HTML bağlamında rastgele veriler kullanırken kullanmayı unutmayın . Aksi takdirde, verilerde ayrılmış karakterler kullanıldığında geçerli HTML oluşturma riskiniz vardır.
Brad

25

Bunu deneyin, çalışması gerekir, aksi takdirde sorununuzu belirtmek için hatayı yazdırmanız gerekir

$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 enjeksiyonuna geniş açık, 2) OP durumunda hataya neden olan hata işleme içermez.
deceze

+1. @deceze Evet, tamamen açık. Ama artık OP veya kabul edilen cevap kodunu ;-) Ve OP kodunda hataya neden olan hata işleme eksikliği değil ... bu hata ve bu cevap en azından (tek koyarak) LIKEifadedeki değişmez değer dizesi etrafındaki tırnak işaretleri ).
Sepster

1
+1 Lütfen LIKE ve '$ kullanıcı adı' arasına bir boşluk ekleyin, geri kalanı SQL enjeksiyonu dışında iyi görünüyor. Neden LIKE operatörü kullanıcı adı yerine = kullanmıyorsunuz
asim-ishaq

21

Bunun iki nedeni olabilir:

  1. Mysql_query işlevini çağırmadan önce veritabanı bağlantısını açtınız mı? Bunu kodunuzda görmüyorum. Sorguyu yapmadan önce mysql_connect komutunu kullanın. Görmekphp.net/manual/en/function.mysql-connect.php

  2. $ Username değişkeni tek bir alıntı dizesinin içinde kullanılır, bu nedenle değeri sorgu içinde değerlendirilmez. Sorgu kesinlikle başarısız olacaktır.

Üçüncü olarak, sorgu yapısı SQL enjeksiyonuna eğilimlidir . Bu güvenlik tehdidini önlemek için hazırlanmış ifadeler kullanabilirsiniz.


20

Aşağıdaki kodu deneyin. İyi çalışabilir.

$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
Bu kod SQL enjeksiyonuna tabidir ve kullanılmamalıdır.
Brad

15

Git config.php. Ben de aynı problemi yaşadım. Kullanıcı adını ve şifreyi doğrulayın ve ayrıca sql select, config ile aynı addır.


15

Sürüklenmiş mysql_ * işlevini kullanmayın (php 5.5'te belirtilmiş php 7'de kaldırılacaktır). ve bunu mysqli veya pdo ile yapabilirsiniz

İşte tam seçme sorgusu

<?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();
?>

Yayınınız, geçersiz bir sorgu ve yetersiz hata bildirimi olan sorunun ele aldığı sorunlarla ilgilenmez. Bu yazı konu dışı.
Paul Spiegel

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

Ayrıca, benzersiz bir kullanıcı adına sahip bir kullanıcı varsa, bunun için "=" kullanabilirsiniz. Beğenmeye gerek yok.

Sorgunuz:

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

3
Bu kod SQL enjeksiyonuna tamamen açıktır ve kullanılmamalıdır.
Brad

@AnujGarg Bu kod doğrudan girdi alır ve sorguyu birleştirir. Birisi için kendi SQL kendi veri yazabilir usernameve yürütülür.
Brad

Peki kod SQL enjeksiyon önlemek için ne kullanılır?
Anuj Garg

14

MySQL sorgusundan önce bir bağlantı dizesi değişkeni ekleyin. Örneğin, $conntbu kodda:

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

1
Bu, sorudaki sorunları ele almaz. Aynı zamanda yanlıştır ve başka bir hataya neden olur.
Paul Spiegel

12

Her zaman olsun ...

"Uyarı: mysqli_fetch_object (), parametre 1'in mysqli_result olmasını bekler, boolean verilir"

... büyük olasılıkla sorgunuzla ilgili bir sorun var. prepare()Veya query()kudreti dönüş FALSE(Boole), ancak bu genel başarısızlık mesajı ipuçları yolunda çok teşekkür bırakmaz. Sorgunuzda neyin yanlış olduğunu nasıl öğrenebilirsiniz? Siz isteyin !

Her şeyden önce, hata raporlamanın açık ve görünür olduğundan emin olun: bu iki satırı açılış <?phpetiketinizden hemen sonra dosyalarınızın üstüne ekleyin :

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

Hata raporunuz php.ini dosyasında ayarlanmışsa, bu konuda endişelenmenize gerek kalmaz. Hataları incelikle ele aldığınızdan emin olun ve kullanıcılarınız için herhangi bir sorunun gerçek nedenini asla açıklamayın. Kamunun gerçek nedenini ortaya çıkarmak, sitelerinize ve sunucularınıza zarar vermek isteyenler için altın oyulmuş bir davetiye olabilir. Tarayıcıya hata göndermek istemiyorsanız, web sunucusu hata günlüklerinizi her zaman izleyebilirsiniz. Günlük konumları sunucudan sunucuya değişecektir, örneğin Ubuntu'da hata günlüğü genellikle adresinde bulunur /var/log/apache2/error.log. Bir Linux ortamında hata günlüklerini inceliyorsanız, tail -f /path/to/loghataları gerçek zamanlı olarak meydana geldikçe veya yaptığınız gibi görmek için bir konsol penceresinde kullanabilirsiniz.

Veritabanı bağlantınız ve sorgularınız üzerinde hata denetimi ekleyerek standart hata raporlamasıyla karşılaştığınızda, devam eden sorunlar hakkında size daha fazla ayrıntı verecektir. Sütun adının yanlış olduğu bu örneğe bir göz atın. İlk olarak, genel ölümcül hata mesajını döndüren kod:

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

Hata geneldir ve neler olup bittiğini çözmede size çok yardımcı olmaz.

Birkaç kod satırı ile sorunu hemen çözmek için kullanabileceğiniz çok ayrıntılı bilgi alabilirsiniz . prepare()İfadenin doğruluğunu kontrol edin ve eğer iyiyse, bağlayıcı ve yürütmeye devam edebilirsiniz.

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

Bir şeyler yanlışsa, sizi doğrudan soruna götüren bir hata mesajı gönderebilirsiniz. Bu durumda, footabloda sütun yoktur , sorunu çözmek önemsizdir.

İsterseniz, bu denetimi bir işleve veya sınıfa dahil edebilir ve hataları daha önce belirtildiği gibi incelikle işleyerek genişletebilirsiniz.


2
"Hataları zarifçe ele aldığınızdan ve kullanıcılarınıza herhangi bir sorunun gerçek nedenini hiçbir zaman açığa vurmadığınızdan emin olun." ve echo $error;bir gönderide?
Paul Spiegel

Heads için teşekkürler @PaulSpiegel. Cevabı yazdığım veya tekrar ziyaret ettiğimden beri bir süre geçti ve yankıyı orada bıraktığımı özlemiştim.
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

Bunu dene

$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_ * şimdi tanımlanmıştır ve php 7'den kaldırılacaktır. Bunun yerine mysqli_ * kullanın
Manoj Kumar

9

İlk olarak, veritabanına bağlantınızı kontrol edin. Başarılı bir şekilde bağlandı mı, bağlanmadı mı?

Eğer yapılırsa, bundan sonra bu kodu yazdım ve iyi çalışıyor:

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
Bu kodu kullanmayın. SQL enjeksiyon saldırılarına açıktır.
Brad

9

Sorgunuzu Çalıştırmadan Önce db_close () kullanarak Veritabanını Kapatmadığınızdan Emin Olun:

Sorgu veya veritabanı bağlantısı içeren başka sayfalar dahil etseniz bile bir komut dosyasında birden çok sorgu kullanıyorsanız, veritabanı bağlantınızı kapatan db_close () yöntemini kullandığınız herhangi bir yerde bu nedenle senaryolarınızda bu hatayı yapmamak.


8

Kontrol sırasında herhangi bir MySQL Hatanız görünmüyorsa, veritabanı tablonuzu düzgün bir şekilde oluşturduğunuzdan emin olun. Bu bana oldu. İstenmeyen virgül veya tırnak işareti bulun.


7

Önce bağlantınızı kontrol edin.

Sonra veritabanından tam değeri almak istiyorsanız o zaman yazmalısınız:

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

Ya da yazmanız LIKEgereken değer türünü getirmek istiyorsanız :

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

3
Bu kod SQL enjeksiyonuna tamamen açıktır ve kullanılmamalıdır.
Brad

6

$resultGetirme dizisini çalıştırmadan önce, bu şekilde başarısız olup olmadığını da kontrol edebilirsiniz.

$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
Bu kodu kullanmayın. SQL enjeksiyon saldırılarına açıktır.
Brad

Ancak kod çalışırsa, kodu düzenlemek ve kodu kullanmak yerine gerekli filtreleri girmeniz gerektiğini hissediyorum.
user28864

Filtrelerin basit kullanımı bu kodda neyin yanlış olduğunu düzeltmez. En iyi çözüm, PDO veya benzeri ile hazırlanmış / parametrelenmiş sorgular kullanmaktır. Burada doğru cevap zaten gönderildiğinden, bunu düzeltmek için herhangi bir nokta görmüyorum. İdeal olarak, bu cevap silinecektir. Ancak, cevabınızı düzeltmeye açıksınız ve eğer doğruysa memnuniyetle oylayacağım.
Brad

Eğer cevabın dikkate almaya değer olmadığını düşünüyorsanız, devam edip okuyabilirsiniz. Ancak, bu topluluğun bütününün bilgiyi paylaşmak ve katkıda bulunmak olduğunu düşündüm. İnsanları göstermek ve ertelemek yerine paylaşacak bir şeyiniz varsa.
user28864

2
Haklısın, bu topluluğun bütün amacı bilgiyi paylaşmak. Bu yüzden downvote'umla ilgili açıklama eklendi ve filtre önerinizin neden yeterli olmadığını açıkladı. Cevabınızı bulan başkalarıyla birlikte yukarıdaki kodun güvensiz olduğu konusunda sizi uyarmayı tercih ederim. Herkesin, kötü kodu sürdürmek yerine doğru yöntemleri öğrenmesi daha iyidir. Ve cevabınızı silemem, ben de yapmam. Bunu seçerseniz, bu size kalmış.
Brad

4

Genellikle veritabanı bağlantınız başarısız olduğunda bir hata oluşur, bu nedenle veritabanınızı bağladığınızdan veya veritabanı dosyasını eklediğinizden emin olun.

include_once(db_connetc.php');

VEYA

// 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
  • En iyi uygulama, sorguyu sqlyog'da çalıştırmak ve daha sonra sayfa kodunuza kopyalamaktır.
  • Sorgunuzu her zaman bir değişkende saklayın ve ardından bu değişkeni tekrarlayın. Sonra geç mysql_query($query_variable);.

2
1) Burada, yukarı veya aşağı herhangi bir cevaba sahip olup olmadığımı bilmiyorsunuz. 2) İlk yorumda açıkladığım gibi; cevabınız sorunu referans almıyor ( boolean mysql_fetch_array'a geçti ) ve sözdizimi hatalarınız var
Phil

2
Her iki kod örneğinizde de yanlış tırnak işareti var. İkinci kod bloğunuza uygulanan sözdizimi vurgulaması, bir şeyin yanlış olduğuna dair ölü bir
Phil

4
Bu kod SQL enjeksiyonuna tabidir ve kullanılmamalıdır. @EngrZardari bu kodları üretim sistemlerinizde kullanıyorsanız, şüphesiz saldırıya uğramışsınızdır ve PDO veya benzeri ile hazırlanmış / parametreli sorgular kullanarak durumu satın almalısınız. Bu tür güvenlik açıkları için otomatik teste sahip botlar vardır.
Brad

1
@EngrZardari Hakkında "herhangi bir hata yok, ben şu anda kullandığım kodu yapıştırılan var." yukarıdaki yorum . Düzeltdiğim sorguda eksik bir alıntı vardı. Bu bir (PHP) ayrıştırma hatası atardı.
Funk Forty Niner

2

Bu kodu deneyin iyi çalışıyor

post değişkenini değişkene ata

   $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
Bu kod SQL enjeksiyon saldırılarına tabidir ve kullanılmamalıdır.
Brad

1

$ username bir php değişkeni olduğu için mysqli'ye dize olarak geçirmemiz gerekiyor, bu yüzden u tek bir alıntı ile başladığımız sorguda çift tırnak, tek tırnak ve tam noktaya geçme için kullanacağız ("'. $ username. '"), çift tırnak işareti ile başladıysanız, tırnak işaretlerini ('". $ kullanıcı adı. "') tersine çevirirsiniz.

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

ama Mysql kullanımı çok değer kaybetti, bunun yerine PDO kullanın. basit ama çok güvenli


Ancak Mysql kullanımı değer kaybetti. bunun yerine PDO kullanabilirsiniz. Size örnek bir giriş vereyim.
Dennis Kiptugen

2
Parolalar ASLA ASLA düz metin biçiminde saklanmamalı, PHP'nin parolaların karmalanması ve karma parolaların doğrulanması için sahip olduğu yerleşik işlevlerden yararlanmamalıdır!
SpacePhoenix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.