Mysql возвращает наибольшее значение идентификатора, пока не запрашивается в PHP

0

Мой PHP-скрипт возвращает значение Mysql с наивысшим идентификатором, а не запрошенным ID:

 <?php
$db = mysqli_connect('localhost', 'root', '(Password)', 'web');
#THE 'userEmail' variable is from a script above not displayed on here
$email = $row['userEmail'];
$result = mysqli_query($db, "SELECT * FROM table WHERE email = '$email'");

echo "<center><table border='1'>

    <tr>
    <th>Username</th>
    <th>Password</th>
    <th>Active?</th>
    <th>Add Account</th>
    <th>Delete Account</th>
    </tr>";

while($row = mysqli_fetch_array($result))
{

    $userName = $row['username'];
    $passWord = $row['password'];
    $addId = $row['id'];
    $deleteId = $row['id'];
    echo "<tr>";
    echo "<td>" . $row['username'] . "</td>";
    echo "<td>" . $row['password'] . "</td>";
    echo "<td>" . $row['activeStatus'] . "</td>";
    echo "<td><a href=home.php?add=$addId>Add Account</a></td>";
    echo "<td><a href=home.php?delete=$deleteId>Delete Account</a></td>";
    echo "</tr>";
}
echo "</table></center>";

if( isset($_GET['delete']) ) {  
    $deleteId = $_GET['delete'];
    $delete = "DELETE FROM table WHERE id = $deleteId";
    $result = mysqli_query($db, $delete);
    deleteLineInFile("/var/www/html/table-users.txt","'$userName'");
    if ($result == TRUE) {
        echo "Record updated successfully";
        header('Location: home.php');
    } else {
        echo "Error updating record";
    }
}

if( isset($_GET['add']) ) {  
    $addId = $_GET['add'];
    $add = "(Too long to display)";

    echo("$userName, $passWord"); 

    file_put_contents("/var/www/html/directory/$addId.xml", $add);
    header("Location: directory/$addId.xml");

}

function deleteLineInFile($file,$string)
{
    $i=0;$array=array();

    $read = fopen($file, "r") or die("can't open the file");
    while(!feof($read)) {
        $array[$i] = fgets($read);  
        ++$i;
    }
    fclose($read);

    $write = fopen($file, "w") or die("can't open the file");
    foreach($array as $a) {
        if(!strstr($a,$string)) fwrite($write,$a);
    }
    fclose($write);
}
?>

Каждый раз, когда я пытаюсь получить идентификатор, он отображает только идентификатор с наивысшим значением. Я не знаю, в чем проблема. Я думаю, что это проблема с строкой, потому что $userName = $row['username']; и $passWord = $row['password']; строки сохраняются в цикле. Я заметил, что он правильно вернет id для переменной $_GET, но не будет для переменной $row. Может ли кто-нибудь помочь мне разобраться в этой ситуации?

  • 0
    Что вы подразумеваете под запрошенным идентификатором? Вы имеете в виду запрошенное письмо в $row['userEmail'] ?
  • 0
    Ваша оценка верна, последнее значение в $addId записей будет тем, которое хранится в $addId и $deleteId , так как вы перебираете их и перезаписываете предыдущее значение. Какой ваш желаемый результат?
Показать ещё 6 комментариев
Теги:

2 ответа

0
Лучший ответ

Когда форма отправлена, $userName и $password не содержат информацию о предоставленных ID, они содержат последнее значение из в while цикла. Вам нужно сделать запрос базы данных, чтобы найти соответствующее имя пользователя.

if( isset($_GET['add']) ) {  
    $addId = $_GET['add'];
    $add = "(Too long to display)";
    $stmt = mysqli_prepare($db, "SELECT username, password FROM table WHERE id = ?");
    mysqli_stmt_bind_param($stmt, "i", $addId);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $userName, $passWord);
    if (mysqli_stmt_fetch($stmt)) {
        echo("$userName, $passWord"); 

        file_put_contents("/var/www/html/directory/$addId.xml", $add);
        header("Location: directory/$addId.xml");
    } else {
        die("User ID $addId not found");
    }
}

Я также показал, как использовать подготовленный оператор для защиты от SQL-инъекций. Вы должны использовать этот метод повсюду.

  • 0
    Спасибо за ответ! К сожалению, эта модификация PHP не сработала.
  • 0
    Не могли бы вы конкретнее сказать, что не так?
Показать ещё 6 комментариев
0

Как было отмечено Barmar и я, ваши $userName и $passWord переменные переписывается в while цикл. Таким образом, ID указанный в $_GET['add'] и $_GET['delete'], не будет связан с правильным $userName.

Чтобы решить проблему, вы должны найти информацию о пользователе по ID связанному с желаемым запросом на add или delete $_GET.

Примечание: использование объектно-ориентированного синтаксиса mysqli используется ниже, поскольку он менее подробен и лично мне легче читать.

<?php
#/var/www/html/home.php

$db = mysqli_connect('localhost', 'root', '(Password)', 'web');

/* ensure an expected action is requested and determine associated ID */
$actionId = null;
if (!empty($_GET['add'])) {
    $actionId = $_GET['add'];
} elseif (!empty($_GET['delete'])) {
    $actionId = $_GET['delete'];
}

/* execute action before outputting user table (use strict comparison operator !==) */
if (null !== $actionId) {
    /* an action was specified - retrieve the associated user details from the database */
    if (!$stmt = $db->prepare('SELECT username, password FROM table WHERE id = ?')) {
        die('Unable to retrieve user details.');
    }
    $stmt->bind_param('s', $actionId);
    $stmt->execute();
    $stmt->bind_result($userName, $passWord);
    if (!$stmt->fetch()) {
        die('Unknown user specified');
    }

    /* execute desired add action */
    if (isset($_GET['add'])) {
        # debug code prevents redirect
        die("$userName, $passWord");

        $add = '(Too long to display)';
        /* use __DIR__ as opposed to full path in case you ever move hosts */
        file_put_contents(__DIR__ . "/directory/$actionId.xml", $add);
        header("Location: directory/$actionId.xml");
        exit;
    }

    /* execute desired delete action */
    if (isset($_GET['delete'])) {
        if (!$stmtDelete = $db->prepare('DELETE FROM table WHERE id = ?')) {
            die('Error updating record');
        }
        $stmtDelete->bind_param('s', $actionId);
        if (!$result = $stmtDelete->execute()) {
            die('Error updating record');
        }

        /*
         * only check file if it was deleted from the database successfully
         * use __DIR__ as opposed to full path in case you ever move hosts
         */
        deleteLineInFile(__DIR__ . '/table-users.txt', "'$userName'");

        # debug code prevents redirect
        die('Record updated successfully');

        header('Location: home.php');
        exit;
    }
}

/*
 * this is where <html> should start unless you utilize output buffering
 * output the HTML and your table data after your request action, to ensure the redirects occur
 */
$email = $row['userEmail']; //retrieved from somewhere else
if (!$stmt = $db->prepare('SELECT id, username, password, activeStatus FROM table WHERE email = ?')) {
    die('Unable to retrieve account list');
}
$stmt->bind_param('s', $email);
$stmt->bind_result($userId, $userName, $passWord, $activeStatus);

echo "<center><table border='1'>
    <tr>
    <th>Username</th>
    <th>Password</th>
    <th>Active?</th>
    <th>Add Account</th>
    <th>Delete Account</th>
    </tr>";

while ($stmt->fetch()) {
    //always escape user supplied values being output to HTML
    $userName = htmlentities($userName, ENT_QUOTES, 'UTF-8', false);
    $passWord = htmlentities($passWord, ENT_QUOTES, 'UTF-8', false);
    $activeStatus = htmlentities($activeStatus, ENT_QUOTES, 'UTF-8', false);
    echo "<tr>";
    echo "<td>" . $userName . "</td>";
    echo "<td>" . $passWord . "</td>";
    echo "<td>" . $activeStatus . "</td>";
    echo "<td><a href='home.php?add=" . $userId . "'>Add Account</a></td>";
    echo "<td><a href='home.php?delete=" . $userId . "'>Delete Account</a></td>";
    echo "</tr>";
}
echo "</table></center>";

Я также предлагаю преобразовать ваши атрибуты HTML из одной кавычки ' с использованием двойной кавычки ", чтобы обеспечить совместимость и единообразие с любой другой библиотекой, которую вы можете использовать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню