Мой 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
. Может ли кто-нибудь помочь мне разобраться в этой ситуации?
Когда форма отправлена, $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-инъекций. Вы должны использовать этот метод повсюду.
Как было отмечено 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 из одной кавычки '
с использованием двойной кавычки "
, чтобы обеспечить совместимость и единообразие с любой другой библиотекой, которую вы можете использовать.
$row['userEmail']
?$addId
записей будет тем, которое хранится в$addId
и$deleteId
, так как вы перебираете их и перезаписываете предыдущее значение. Какой ваш желаемый результат?