PHP MySQL silmez

5 Cevap php

Nedense, JavaScript / PHP alışkanlık MySQL benim verileri silin! İşte sorunun yıkık.


Ben tek tek her biri için girdisini silmek için bir düğme ile, güzel bir biçimde tüm MySQL girdileri görüntüler bir dizi var. Bu şuna benzer:

<?php

    		include("login.php");

    	//connection to the database
    	$dbhandle = mysql_connect($hostname, $username, $password)
    	 or die("<br/><h1>Unable to connect to MySQL, please contact support at support@michalkopanski.com</h1>");

    	//select a database to work with
    	$selected = mysql_select_db($dbname, $dbhandle)
    	  or die("Could not select database.");

    	//execute the SQL query and return records
    	if (!$result = mysql_query("SELECT `id`, `url` FROM `videos`"))
    	echo 'mysql error: '.mysql_error();

    	//fetch tha data from the database
    	while ($row = mysql_fetch_array($result)) {
    	   ?>

       <div class="video"><a class="<?php echo $row{'id'}; ?>" href="http://www.youtube.com/watch?v=<?php echo $row{'url'}; ?>">http://www.youtube.com/watch?v=<?php echo $row{'url'}; ?></a><a class="del" href="javascript:confirmation(<? echo $row['id']; ?>)">delete</a></div>

<?php }

//close the connection
mysql_close($dbhandle);
?>

Silme düğmesi javascript:confirmation(<? echo $row['id']; ?>) bir href vardır, bu nedenle silme tıkladığınızda, bu çalışır:

<script type="text/javascript">
<!--
function confirmation(ID) {
    var answer = confirm("Are you sure you want to delete this video?")
    if (answer){
    	alert("Entry Deleted")
    	window.location = "delete.php?id="+ID;
    }
    else{
    	alert("No action taken")
    }
}
//-->
</script>

JavaScript teorik sayfa delete.php üzerine 'kimliği' geçmelidir. Bu sayfa, bu gibi görünüyor (ve ben sorunun nerede bu olduğunu düşünüyorum):

<?php

include ("login.php");

mysql_connect($hostname, $username, $password)
 or die("Unable to connect to MySQL");

mysql_select_db ($dbname)
or die("Unable to connect to database");

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` ='.$id.'");
echo ("Video has been deleted.");
?>

Bunun cevabını biliyor olabilir orada kimse varsa, ben çok takdir ediyorum. Ben de (emin olmayanlar için) önerilere açığım.

Teşekkürler!

5 Cevap

Lütfen delete.php komut dosyasında, bu satırı kullanıyor:

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` ='.$id.'");

$id değişken var değildir: Bu gibi $_GET değişkeni onu başlatmak gerekir:

$id = $_GET['id'];

(This is because your page is called using an HTTP GET request -- ie, parameters are passed in the URL)

Ayrıca, sorgu oldukça garip geliyor: ne yerine bu konuda:

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` = '$id' ");

yani, kaldırma '.': zaten bir dize içinde, yani ) (the dot operator PHP dizeleri birleştirme içindir bağlamak için bir şey yok


Note :

  • if this works on some server, it is probably because of register_globals
    • Detaylı bilgi için, bkz: Using Register Globals
    • But note that this "feature" has been deprecated, and should definitly not be used !
      • Bu güvenlik risklerinin neden olur
      • Ve PHP 6 kaybolur gerekir - bu güzel bir değişiklik olacak, eski uygulamaların bir çift kırılsa bile
  • your code has a big SQL injection hole : you should sanitize/filter/escape the $id before using it in a query !
    • If you video.id is a string, this means using mysql_real_escape_string
      • Nerede mysqli veya PDO uzantılarını kullanarak, ayrıca hazırlanmış tablolara bakmak olsaydı
    • bir tamsayı ile, intval aslında bir tamsayı almak emin olmak için diyebilirsiniz.


So, in the end, I would say you should use something that looks like this :

$id = $_GET['id'];
$escaped_id = mysql_real_escape_string($id);
$query = "DELETE FROM `videos` WHERE `videos`.`id` = '$escaped_id'";
// Here, if needed, you can output the $query, for debugging purposes
mysql_query($query);

Bu yardımcı olur umarım!

Çok garip sorgu dize sınırlandırmak için çalışıyoruz ... Bu ne istediğiniz:

mysql_query('DELETE FROM `videos` WHERE `videos`.`id` ='.$id);

Ama emin olun sorgulamak önce $id / validate sterilize!

Pascal söylediği gibi Edit: Ve, atamak gerekir $id = $_GET['id'];. Bunu gözardı.

Lütfen delete.php size $ id atmadı.

Sen $ _REQUEST ['id'] (ya da diğer global değişken) değeri kontrol etmeniz gerekir ve bir tamsayı var SADECE eğer, buna $ id set.

EDIT: Oh, ayrıca sorguda $ id öncesi ve sonrası dönemleri kaldırmak gerekir. Eğer sql sunucusuna göndererek ne yaptığınızı görmek böylece size sorgu yazdırmak gerekir. Ayrıca, SQL sunucunun hata mesajı alabilirsiniz.

You add extra dots in the string. Use

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` ='$id'");

yerine

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` ='.$id.'");

Eğer değerini almak nasıl da kontrol $id.

Herkese teşekkürler. I Pascal MARTIN's cevap kullanılan ve ben istek ($_GET) kıymetli sayfasından 'id' almak için eksik olduğunu göstermek için geliyor, ve benim sorguda bazı yanlış olduğunu .

Burada çalışma kopyası:

<?php

include ("login.php");

$id = $_GET['id'];

mysql_connect($hostname, $username, $password)
 or die("Unable to connect to MySQL");

mysql_select_db ($dbname)
or die("Unable to connect to database");

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` = $id ");
echo ("Video ".$id." has been deleted.");
?>

Tekrar teşekkürler!