Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление строки из БД 
:(
    Опции темы
LexzCQ
Дата 19.11.2014, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.11.2014

Репутация: нет
Всего: нет



Приветствую. 

Решил разобраться с PHP и MySQL и в процессе у меня возникла такая проблема - нужно удалить строку по нажатию кнопки в выведенной через HTML таблице. Поэтому вопрос - как это можно сделать. 

На всякий случай вот код:

Код

<?php      
    $db =  mysql_connect('127.0.0.1', 'root', '1234') or die("Could not connect: " . mysql_error());
    mysql_select_db("test", $db) or die("Could not connect: " . mysql_error()); 
        //Делаем выборку всего и вся в БД    
        if (isset($_GET['delete'])){
            $select = mysql_query("SELECT * FROM clients INNER JOIN agreements ON clients.Agreement_number = agreements.Agreement_number INNER JOIN price ON clients.Agreement_number = price.Agreement_number");
                
            // выводим на страницу сайта заголовки HTML-таблицы
                echo '<form action="delete.php">';
                echo '<table border="1" align="center">';
                echo '<thead>';
                echo '<tr>';
                echo '<th>№</th>';
                echo '<th>Название клиента</th>';
                echo '<th>Номер договора</th>';
                echo '<th>Дата подписания договора</th>';
                echo '<th>Дата окончания договора</th>';
                echo '<th>Цена</th>';
                echo '<th>Редактировать</th>';
                echo '<th>Удалить</th>';
                echo '</tr>';
                echo '</thead>';
                // выводим в HTML-таблицу все данные из БД
                echo '<tbody>';    
                        while($data = mysql_fetch_array($select)){
                        echo '<tr align="center">';
                        echo '<td>' . $data['idAgreements'] . '</td>';
                        echo '<td>' . $data['Name'] . '</td>';
                        echo '<td>' . $data['Agreement_number'] . '</td>';
                        echo '<td>' . $data['Start_date'] . '</td>';
                        echo '<td>' . $data['End_date'] . '</td>';
                        echo '<td>' . $data['Price'] . '</td>';
                        echo '<td> <input name="edit_button" type="submit" value="Редактировать"> </td>'; //Кнопка редактирования для каждой строки
                        echo '<td> <input name="delete_button" type="submit" value="Удалить"> </td>'; //Кнопка удаления для каждой строки
                        echo '</tr>';
                        }
                echo '</tbody>';
                echo '</table>';
                echo '</form>';

                echo('<a href="sql.html"> Назад</a>');

                        //удаление содержимого
        if (isset($_GET['delete_button'])){
            
            mysql_query("DELETE FROM clients WHERE clients.idClintes='$_GET' ",$db); //Вот здесь не правильно, но не факт.

        }
            }
        

?>

PM MAIL   Вверх
_zorn_
Дата 20.11.2014, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Во первых, в запросе будет как edit_button так и delete_button (они в одной форме). Во вторых неизвестно на какой строке кнопка нажата. Ну и в третих в $_GET всегда будет 'array'

Решение в лоб - на каждую строку по две формы с hidden полями. Общую форму убрать.
Код

 while($data = mysql_fetch_array($select)){
echo '<form>';
                        echo '<tr align="center">';
                        echo '<td>' . $data['idAgreements'] . '</td>';
                        echo '<td>' . $data['Name'] . '</td>';
                        echo '<td>' . $data['Agreement_number'] . '</td>';
                        echo '<td>' . $data['Start_date'] . '</td>';
                        echo '<td>' . $data['End_date'] . '</td>';
                        echo '<td>' . $data['Price'] . '</td>';
                        echo '<td> <input name="edit_button" type="submit" value="Редактировать"> </td>'; //Кнопка редактирования для каждой строки
echo '<input type="hidden" name="edit_row" value="'.$data['idClintes'].'"></form><form>';
                        echo '<td> <input name="delete_button" type="submit" value="Удалить"> </td>'; //Кнопка удаления для каждой строки
echo '<input type="hidden" name="delete_row" value="'.$data['idClintes'].'"></form>';
                        echo '</tr>';
                        }
....
if($_GET['delete_row'])
{
  mysql_query("DELETE FROM clients WHERE clients.idClintes='".intval($_GET['delete_row'])."' ",$db);
}

Ну а для дебага/понимания юзай 
Код

print_r($_GET);

Еще у вас возможно опечатка в idClintes
PM MAIL   Вверх
Aliance
Дата 20.11.2014, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



_zorn_, странное какое-то расположение тегов формы. Почему бы не оборачивать их внутри строчки таблицы?
PM MAIL WWW ICQ Skype   Вверх
LexzCQ
Дата 20.11.2014, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.11.2014

Репутация: нет
Всего: нет



Цитата(_zorn_ @ 20.11.2014,  03:12)
Во первых, в запросе будет как edit_button так и delete_button (они в одной форме). Во вторых неизвестно на какой строке кнопка нажата. Ну и в третих в $_GET всегда будет 'array'

Решение в лоб - на каждую строку по две формы с hidden полями. Общую форму убрать.
Код

 while($data = mysql_fetch_array($select)){
echo '<form>';
                        echo '<tr align="center">';
                        echo '<td>' . $data['idAgreements'] . '</td>';
                        echo '<td>' . $data['Name'] . '</td>';
                        echo '<td>' . $data['Agreement_number'] . '</td>';
                        echo '<td>' . $data['Start_date'] . '</td>';
                        echo '<td>' . $data['End_date'] . '</td>';
                        echo '<td>' . $data['Price'] . '</td>';
                        echo '<td> <input name="edit_button" type="submit" value="Редактировать"> </td>'; //Кнопка редактирования для каждой строки
echo '<input type="hidden" name="edit_row" value="'.$data['idClintes'].'"></form><form>';
                        echo '<td> <input name="delete_button" type="submit" value="Удалить"> </td>'; //Кнопка удаления для каждой строки
echo '<input type="hidden" name="delete_row" value="'.$data['idClintes'].'"></form>';
                        echo '</tr>';
                        }
....
if($_GET['delete_row'])
{
  mysql_query("DELETE FROM clients WHERE clients.idClintes='".intval($_GET['delete_row'])."' ",$db);
}

Ну а для дебага/понимания юзай 
Код

print_r($_GET);

Еще у вас возможно опечатка в idClintes

Всё равно не работает, ругается в этой части кода

Код

if($_GET['delete_row']){
              mysql_query("DELETE FROM clients WHERE clients.idClients='".intval($_GET['delete_row'])."' ",$db) or die("Could not connect: " . mysql_error());
                    echo ("Строка удалена");
                } 


на delete_row в первой строке и само собой ничего не удаляет, а print_r($_GET); почему-то показывает на if (isset($_GET['delete'])), а именно на delete, но это же всего лишь название кнопки которая передаёт скрипту команду на выполнение или я чего-то упустил?
PM MAIL   Вверх
Aliance
Дата 21.11.2014, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



1. MySQL уже давно deprecated, переходите на PDO.
2. Зачем писать так:
Цитата
"DELETE FROM clients WHERE clients.idClients='".intval($_GET['delete_row'])."' "

когда можно так:
Код

"DELETE FROM clients WHERE idClients=" . intval($_GET['delete_row'])

3. Как я уже написал выше, зачем писать
Цитата

                        echo '<form>';
                        echo '<tr align="center">';
                        echo '<td> <input name="edit_button" type="submit" value="Редактировать"> </td>'; //Кнопка редактирования для каждой строки
echo '<input type="hidden" name="edit_row" value="'.$data['idClintes'].'"></form><form>';
                        echo '<td> <input name="delete_button" type="submit" value="Удалить"> </td>'; //Кнопка удаления для каждой строки
echo '<input type="hidden" name="delete_row" value="'.$data['idClintes'].'"></form>';
                        echo '</tr>';

когда можно и нужно писать так:
Код

?>
<tr align="center">
    <td>
        <form>
            <input name="edit_button" type="submit" value="Редактировать">
            <input type="hidden" name="edit_row" value="<?=$data['idClintes']?>">
        </form>
    </td>
    <td>
        <form>
            <input name="delete_button" type="submit" value="Удалить">
            <input type="hidden" name="delete_row" value="<?=$data['idClintes']?>">
        </form>
    </td>
</tr>
<?php


По хорошему конечно сделать 3 разных скрипта: один основной, который печатает таблицу, 2 для редактирования и 3 для удаления (указав их урлы в теге формы в атрибуте action), но можно и так.

4. И далее, меня терзают смутные сомнения, что ваш скрипт выглядит примерно так:
Код

<?php
// тут у нас куча echo с выводом html
if ($_GET['edit_button']) {
    // тут у нас скрипт редактирования
}
if ($_GET['delete_button']) {
    // тут у нас скрипт удаления
}
?>


Тогда как он должен выглядеть примерно так:
Код

<?php
if ($_GET['edit_button']) {
    // тут у нас скрипт редактирования
} elseif ($_GET['delete_button']) {
    // тут у нас скрипт удаления
} else {
    // тут у нас куча echo с выводом html
}
?>


Потому как выводить html даже в случае редактирования/удаления не стоит сразу, а стоит сделать редирект на самого себя без get параметров, чтобы избежать повторного выполнения операции по F5.

5. Не стоит использовать GET для операций редактирования/удаления, для этого есть POST/DELETE.

6. Про MVC/ООП я конечно же промолчу smile

Добавлено через 1 минуту и 47 секунд
Цитата(LexzCQ @  20.11.2014,  19:24 Найти цитируемый пост)
ругается в этой части кода

и как ругается-то? тут же не экстрасенсы, приводите цитаты ошибок.

кроме того, в самом начале (ан 2 строчке например) можно написать, как вам уже посоветовали, что-то типа:
Код

echo '<pre>'; var_dump( $_GET ); exit;

и наглядно увидеть что приходит.
PM MAIL WWW ICQ Skype   Вверх
_zorn_
Дата 24.11.2014, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(Aliance @  20.11.2014,  17:36 Найти цитируемый пост)
странное какое-то расположение тегов формы

Там много чего странного, я просто чтобы меньше оригинал менять  smile 
PM MAIL   Вверх
LexzCQ
Дата 24.11.2014, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.11.2014

Репутация: нет
Всего: нет



Цитата(Aliance @ 21.11.2014,  09:18)
Скрытый текст
1. MySQL уже давно deprecated, переходите на PDO.
2. Зачем писать так:
Цитата
"DELETE FROM clients WHERE clients.idClients='".intval($_GET['delete_row'])."' "

когда можно так:
Код

"DELETE FROM clients WHERE idClients=" . intval($_GET['delete_row'])

3. Как я уже написал выше, зачем писать
Цитата

                        echo '<form>';
                        echo '<tr align="center">';
                        echo '<td> <input name="edit_button" type="submit" value="Редактировать"> </td>'; //Кнопка редактирования для каждой строки
echo '<input type="hidden" name="edit_row" value="'.$data['idClintes'].'"></form><form>';
                        echo '<td> <input name="delete_button" type="submit" value="Удалить"> </td>'; //Кнопка удаления для каждой строки
echo '<input type="hidden" name="delete_row" value="'.$data['idClintes'].'"></form>';
                        echo '</tr>';

когда можно и нужно писать так:
Код

?>
<tr align="center">
    <td>
        <form>
            <input name="edit_button" type="submit" value="Редактировать">
            <input type="hidden" name="edit_row" value="<?=$data['idClintes']?>">
        </form>
    </td>
    <td>
        <form>
            <input name="delete_button" type="submit" value="Удалить">
            <input type="hidden" name="delete_row" value="<?=$data['idClintes']?>">
        </form>
    </td>
</tr>
<?php


По хорошему конечно сделать 3 разных скрипта: один основной, который печатает таблицу, 2 для редактирования и 3 для удаления (указав их урлы в теге формы в атрибуте action), но можно и так.

4. И далее, меня терзают смутные сомнения, что ваш скрипт выглядит примерно так:
Код

<?php
// тут у нас куча echo с выводом html
if ($_GET['edit_button']) {
    // тут у нас скрипт редактирования
}
if ($_GET['delete_button']) {
    // тут у нас скрипт удаления
}
?>


Тогда как он должен выглядеть примерно так:
Код

<?php
if ($_GET['edit_button']) {
    // тут у нас скрипт редактирования
} elseif ($_GET['delete_button']) {
    // тут у нас скрипт удаления
} else {
    // тут у нас куча echo с выводом html
}
?>


Потому как выводить html даже в случае редактирования/удаления не стоит сразу, а стоит сделать редирект на самого себя без get параметров, чтобы избежать повторного выполнения операции по F5.

5. Не стоит использовать GET для операций редактирования/удаления, для этого есть POST/DELETE.

6. Про MVC/ООП я конечно же промолчу smile

Добавлено @ 09:20
Цитата(LexzCQ @  20.11.2014,  19:24 Найти цитируемый пост)
ругается в этой части кода

и как ругается-то? тут же не экстрасенсы, приводите цитаты ошибок.

кроме того, в самом начале (ан 2 строчке например) можно написать, как вам уже посоветовали, что-то типа:
Код

echo '<pre>'; var_dump( $_GET ); exit;

и наглядно увидеть что приходит.

Спасибо, заработало. Проблема была в том, что я использовал два цикла if, вместо того что бы использовать конструкцию if... elseif. Поменял и всё заработало, теперь нужно разобраться почему не хочет работать UPDATE запрос.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.