1

Тема: Видалення по поточному ID.

Маємо таблицю з ФІО, номер договору і дата. Результат виводиться в таблиці таким чином:

while($row = mysqli_fetch_assoc($result)){
        ?>
    <table>
        <tr>
            <td><?php echo $row['name']; ?></td>
            <td><?php echo $row['id_contract']; ?></td>
            <td><?php echo $row['date']; ?></td>
            <td><a href="deletefromid.php?">Delete</a></td>
        </tr>
    </table>

Я хочю навпроти кожного користувача поставити посилання на сторінку видалення. На 2 сторінці буде шось типу

$del = "DELETE FROM users WHERE id=$id"

Шось гуглив і нічого не знайшов. Як це все правильно організувати, щоб воно знало який пртрібно ІД видалити по лінку? Чи то треба якось по лінку передати цей ід delerefromid.php?id=id і вже на другій сторінці вказати WHERE id=$id ???

2

Re: Видалення по поточному ID.

Все залежить від того хто видаляє, і кого йому можна видаляти. Якщо це адмін, то він може будь-якого користувача видалити. В такому разі залишилось в таблицю передати його ID, тільки не зовсім зрозуміло в чому проблема. Об’єкт $row не має ID, в цьому проблема?

3 Востаннє редагувалося koala (09.04.2016 10:48:27)

Re: Видалення по поточному ID.

З мінімальними змінами:

<td><a href="deletefromid.php?id=$row['id_contract']">Delete</a></td>

//deletefromid.php
...
if(is_numeric($_GET["id"])) {
  $id = intval($_GET["id"]);
  $del = "DELETE FROM users WHERE id=$id";
  ...//виконати запит
}

А якщо серйозніше, то:
- запит до сервера на видалення має бути POST (форми чи AJAX), щоб уникнути повторень;
- переходьте на mysqli, функції mysql застарілі, бо небезпечні;
- краще не видаляти значення з БД, а додати індексоване булеве поле "видалений" і встановлювати його значення, а при запити брати тільки "невидалені" поля. Краще раз на тиждень видаляти застаріле (якщо місця зовсім мало), ніж випадково стерти півтаблиці, а потім рвати на собі волосся.

Подякували: Анатолій, 221VOLT, leofun01, Yola, fanatp5

4

Re: Видалення по поточному ID.

   <td><a href="deletefromid.php?id=<?php echo $row['id']; ?>">Delete</a></td>

deletefromid.php
Простий варіант без різних перевірок на існування запису, прав доступу і т.д..

//підключення до бд
$id = isset($_GET['id']) ? (int)$_GET['id'] : NULL;
mysql_query("DELETE FROM users WHERE id = '$id' LIMIT 1");
Подякували: leofun011

5 Востаннє редагувалося iovchynnikov (09.04.2016 17:08:18)

Re: Видалення по поточному ID.

VTrim написав:
   <td><a href="deletefromid.php?id=<?php echo $row['id']; ?>">Delete</a></td>

deletefromid.php
Простий варіант без різних перевірок на існування запису, прав доступу і т.д..

//підключення до бд
$id = isset($_GET['id']) ? (int)GET['id'] : NULL;
mysql_query("DELETE FROM users WHERE id = '$id' LIMIT 1");

Такий варіант буде намагатися видалити (виконати запит) навіть якщо буде пустий параметр id, що викине помилку.

Подякували: leofun011

6

Re: Видалення по поточному ID.

iovchynnikov написав:
VTrim написав:
   <td><a href="deletefromid.php?id=<?php echo $row['id']; ?>">Delete</a></td>

deletefromid.php
Простий варіант без різних перевірок на існування запису, прав доступу і т.д..

//підключення до бд
$id = isset($_GET['id']) ? (int)GET['id'] : NULL;
mysql_query("DELETE FROM users WHERE id = '$id' LIMIT 1");

Такий варіант буде намагатися видалити (виконати запит) навіть якщо буде пустий параметр id, що викине помилку.

Ніякої помилки не буде, просто не видалить і все. Пустий і відсутній GET id - це різне, а $id буде у будь-якому випадку, бо isset() перевіряє на його наявність і в разі відсутності робить змінну пустою. Ці варіанти не є вірними, але раз автор юзає mysql_query() та кривий синтаксис, то й розписувати йому хороші варіанти - бажання немає.

Подякували: leofun011

7

Re: Видалення по поточному ID.

koala а я і написав все mysqli, я просто несильний в сій справі, тільки вчуся для себе.

VTrim з оцим чомусь видає мені помилку "систаксис еррор"

$id = isset($_GET['id']) ? (int)GET['id'] : NULL;

я просто зробив такий pапис

$id = $_GET['id'];
$del = "DELETE FROM users WHERE id=$id";

і все запрацювало.

Питання ше в одному, щоб передати якись параметир без форми завжди треба писали посилання типу echo

<a href="deletefromid.php?id=<?php echo $row['id']; ?>">

8

Re: Видалення по поточному ID.

mmy3uka написав:

Маємо таблицю з ФІО, номер договору і дата. Результат виводиться в таблиці таким чином:

while($row = mysqli_fetch_assoc($result)){
        ?>
    <table>
        <tr>
            <td><?php echo $row['name']; ?></td>
            <td><?php echo $row['id_contract']; ?></td>
            <td><?php echo $row['date']; ?></td>
            <td><a href="deletefromid.php?">Delete</a></td>
        </tr>
    </table>

Я хочю навпроти кожного користувача поставити посилання на сторінку видалення. На 2 сторінці буде шось типу

$del = "DELETE FROM users WHERE id=$id"

Шось гуглив і нічого не знайшов. Як це все правильно організувати, щоб воно знало який пртрібно ІД видалити по лінку? Чи то треба якось по лінку передати цей ід delerefromid.php?id=id і вже на другій сторінці вказати WHERE id=$id ???


допустимо рядки даних ви виводите у show.php
і видаляти ви хочете по id запису (не знаю чи це одне і те ж із id_contract) у del.php
також використовуємо ajax - pure js (якщо юзаєте jQ - приклади самі знайдете, того сміття - як сміття, перепрошую за каламбур)

у такому вигляді це буде якось так --

show.php

while($row = mysqli_fetch_assoc($result)){
        ?>
    <table>
        <tr>
            <td><?php echo $row['name']; ?></td>
            <td><?php echo $row['id_contract']; ?></td>
            <td><?php echo $row['date']; ?></td>
            <td><a href="#" onclick="senddel(<?php echo $row['id']; ?>);return false">Delete</a></td>
        </tr>
    </table>

del.php

$d=(int)$_POST['id'];
if($d>0){
/*підключилися до бд*/
/*відправили запит видалення чи апдейту до бд*/
echo '1';
}else{echo '0';}

js (підключений на сторінці показу даних)

function getXmlHttp(){
    var xmlhttp;
    try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
            xmlhttp = false;
        }
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
        xmlhttp = new XMLHttpRequest();
    }
    return xmlhttp;
}
function senddel(id){
            var xmlhttp = getXmlHttp();
            xmlhttp.open('POST', 'del.php', true);
            xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            var sendinfo="id="+id;
            xmlhttp.send(sendinfo);
            xmlhttp.onreadystatechange = function(){
            if (xmlhttp.readyState == 4){
                            if(xmlhttp.status == 200){
                                if(xmlhttp.responseText!=''){
                                    var r =xmlhttp.responseText;
                                    //console.log(r);
                                    if(r=='1'){alert('ура, деліт!');}else{alert('нажаль, не деліт');}
                                }
                            }
                }
            };
        }

9

Re: Видалення по поточному ID.

Треба було (int)$_GET['id'], а там (int)GET['id']. Вибачаюсь, з телефону писав.
А на рахунок вашого $id = $_GET['id']; то це вразливість SQL Injection, без фільтрації вхідних даних. А раз числові, то хоча б так
(int)$_GET['id']

Подякували: 221VOLT, leofun012

10 Востаннє редагувалося 221VOLT (09.04.2016 18:30:08)

Re: Видалення по поточному ID.

mmy3uka написав:

koala а я і написав все mysqli, я просто несильний в сій справі, тільки вчуся для себе.

VTrim з оцим чомусь видає мені помилку "систаксис еррор"

$id = isset($_GET['id']) ? (int)GET['id'] : NULL;

я просто зробив такий pапис

$id = $_GET['id'];
$del = "DELETE FROM users WHERE id=$id";

і все запрацювало.

Питання ше в одному, щоб передати якись параметир без форми завжди треба писали посилання типу echo

<a href="deletefromid.php?id=<?php echo $row['id']; ?>">

з "таким записом" вам знищить всю таблицю перший-ліпший школяр, який прочитає про скуль-інєкції...
почитайте трошки про фільтрування вхідних даних від користувача
+розберіться з mysqli prepare -- пригодиться


і ще зауваження -- забудьте про таблиці при виводі інформації- використовуйте блоки, ви ж бо вкурсі про основний недолік табличної верстки?

рекомендую вам розібратися з flexbox, для початку на прикладі http://codepen.io/vasansr/pen/PZOJXr
втім, вивід строчок можна і просто на <p> зробити - просто з flexbox меньше проблем у деяких специфічних таблицях...


---
якщо не секрет - вчитеся для себе- з якою ціллю?
написати свій сайт\проект, чи щоб перейти на фріланс, чи ще для чого?

Подякували: leofun011

11

Re: Видалення по поточному ID.

про інєкції вкурсі, я просто маю загальне поняття про PHP+мускул. В основному це html, css (jq - і то готові решення знаходжу). З таблицями не працюю уже дуже давно, оскільки дор зроблений під різні присторої (розширеня) = більший профіт, це я просто так на скору руку написав для вигляду у табличному вигляді.

12

Re: Видалення по поточному ID.

а щоб не додавало по 2 одинакових записа, потрібно їх перевіряти isset() чи якимось жабоскриптом? бо інколи бачу шо в базу додає по 2 одинакох записи.

13

Re: Видалення по поточному ID.

$count = mysql_num_rows(mysql_query("запит до потрібної інформації"));
if($count > 0) {
echo 'інфа вже є';
}
else {
echo 'запис в бд';
}

Можна ще через SELECT COUNT() та mysql_result()

14 Востаннє редагувалося 221VOLT (09.04.2016 19:09:50)

Re: Видалення по поточному ID.

ще можна в таблиці у mysql поля унікальними зробити :)

15

Re: Видалення по поточному ID.

Це у випадку id або інших даних, які в принципі не мають повторюватися.

16

Re: Видалення по поточному ID.

В мене схожа проблема, маю в кінці кожного рядка кнопку, яка посилається на файл з кодом видалення. Але не знаю як зробити видалення по поточному ID? Прочитав підказки вище, але не зміг застосувати їх в своєму варіанті. Ще погано орієнтуюсь PHP.

if ($result->num_rows > 0) {
  echo "<table><tr><th>ID</th><th>Name</th><th>Email</th><th>Date</th><th>Delete</tr>";
        
  while($row = $result->fetch_assoc()) {
    echo "<tr><td>" . $row["id"]. " </td><td> " . $row["firstname"]. " " . $row["lastname"]. " </td>
    <td> " . $row["email"] . " </td><td> " . $row["reg_date"] . "</td><td><form method='get' 
    action='delete.php'><button type='submit'>D</button></form></td></tr>";
}
    echo "</table>";
} else {
    echo "0 results";
}