2009-09-23 2 views
3

По какой-то причине JavaScript/PHP не удалит мои данные из MySQL! Вот краткое изложение проблемы.PHP не будет удаляться из MySQL


У меня есть массив, который отображает все мои записи MySQL в хорошем формате, с кнопкой, чтобы удалить запись для каждого из них в отдельности. Это выглядит следующим образом:

<?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 [email protected]</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); 
?> 

Кнопка удаления имеет HREF из javascript:confirmation(<? echo $row['id']; ?>), так как только вы нажмете на удаление, она работает следующим образом:

<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 должен теоретически передать «ID» на page delete.php. Эта страница выглядит следующим образом (и я думаю, что это где проблема):

<?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."); 
?> 

Если есть кто-то там, что может знать ответ на этот вопрос, я бы очень признателен. Я также открыт для предложений (для тех, кто не уверен).

Спасибо!

+0

Попробуйте некоторые простые методы отладки: выведите ID из файла delete.php, чтобы узнать, получено ли оно, как вы ожидали. – harto

+0

+1 для подробного исходного кода и хорошо написанного вопроса. – MitMaro

+0

@harto: Да, я обычно делал это, но я был так расстроен, что даже не передумал. Это было завязано со мной в течение 30 минут! @MitMaro: Спасибо! Я ценю это, и я надеюсь, что другие читатели могут что-то узнать из этого вопроса. –

ответ

14

В вашем delete.php сценарии вы используете эту строку:

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

Переменная $id не существует: вы должны инициализировать его с переменной $_GET, как это:

$id = $_GET['id']; 

(Это связано с тем, что ваша страница вызывается с использованием HTTP-запроса GET, то есть параметры передаются по URL-адресу)

Кроме того, ваш запрос чувствует себя довольно странно: что об этом вместо:

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

т.е. удаление в «.»: вы внутри строки, уже, так что нет ничего, чтобы сцепить (dot operator в РНР для конкатенации строк)


Примечание:

  • , если это работает на каком-то сервере, это, вероятно, б оскольку из register_globals
    • Для получения дополнительной информации см Using Register Globals
    • Но обратите внимание, что эта «особенность» устарела и не должна использоваться определенно!
      • Это вызывает риски безопасности
      • И должны исчезнуть в PHP 6 - это будет хорошее изменение, даже если он ломает пару старых приложений
  • ваш код имеет большое SQL injection отверстие: вы должны дезинфицировать/фильтровать/убрать $id перед тем, как использовать его в запросе!
    • Если вы video.id строка, это означает, что с помощью mysql_real_escape_string
      • Если вы где с помощью MySQLi или расширения PDO, вы также можете взглянуть на подготовленные заявления
    • с целым числом, вы можете позвонить intval, чтобы убедиться, что вы действительно получаете целое число.


Таким образом, в конце концов, я бы сказал, вы должны использовать что-то, что выглядит следующим образом:

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

Надеется, что это помогает!

+0

Сладкий! Это сработало! Спасибо! =] –

+0

удивительный информация Pascal. – afarazit

0

Вы пытаетесь разграничить вашу строку запроса очень странно ... это то, что вы хотите:

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

Но убедитесь, что вы дезинфицировать/проверить $id, прежде чем запрос!

Редактировать: И, как сказал Паскаль, вам необходимо назначить $id = $_GET['id'];. Я не обратил на это внимания.

+0

Спасибо, ты был на правильном пути, но запрос не работал, даже с запросом $ _GET. Правильный запрос был 'mysql_query (" DELETE FROM 'videos' WHERE' videos'.'id' = $ идентификатор ");' –

+0

извините, он получил все завинчивающейся, вот оно: mysql_query (" DELETE FROM 'videos' WHERE' videos'.'id' = $ id "); –

+0

okay, поэтому я не могу добавить код в комментарии, вот последняя попытка: mysql_query("DELETE FROM 'videos' WHERE 'videos'.'id' = $id ");

0

В вашем файле delete.php вы никогда не устанавливаете $ id.

Вам нужно проверить значение в $ _REQUEST ['id'] (или другую глобальную переменную) и ТОЛЬКО, если это целое число, установите для него $ id.

EDIT: О, также вам нужно удалить периоды до и после $ id в запросе. Вы должны распечатать свой запрос, чтобы вы могли видеть, что вы отправляете на сервер sql. Кроме того, вы можете получить сообщение об ошибке SQL-сервера.

+0

Спасибо, я получил его сейчас! –

0

Вы добавляете дополнительные точки в строку. Использование

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

вместо

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

Кроме того, проверьте, как вы получите значение $id.

0

Спасибо всем. Я использовал Pascal MARTIN's ответ, и выясняется, что я пропустил запрос ($_GET), чтобы получить «идентификатор» с драгоценной страницы и что некоторые из моих запросов были неверными.

Вот рабочая копия:

<?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."); 
?> 

Еще раз спасибо!