Посмотреть / Редактировать / Удалить в PHP - PullRequest
1 голос
/ 19 октября 2011

У меня есть система, в которой пользователи должны зарегистрироваться и войти на мой сайт, чтобы добавить рецепты, которые могут просматривать незарегистрированные пользователи и явно зарегистрированные пользователи из внешнего интерфейса. До сих пор я занимался страницей регистрации, страницей входа и страницей «Моя учетная запись», чтобы пользователи могли входить в систему и отправлять рецепты. Все работает, но теперь я пытаюсь добавить еще одну функциональность в мою систему, чтобы пользователи могли редактировать / удалять свои собственные рецепты. Я выполнил вход в систему путем создания сеанса, который содержит имя пользователя, а не выводил его в URL следующим образом: www.cooking.com/my-account.php?user_id=26.

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

username ()
recipename
ingredients
method
time
id

Как только вы войдете в систему и захотите отредактировать / удалить загруженные вами рецепты, появится таблица, содержащая все загруженные вами рецепты. Я хочу, чтобы пользователь нажал на любой рецепт, и он переместится на другую страницу, где он сможет редактировать свои материалы.

Я пробовал это, но безуспешно. Ниже приведены коды, которые я использовал при отображении ошибки после нажатия кнопки «Изменить»:

РЕДАКТИРОВАНИЕ СТАРТЕРНОЙ СТРАНИЦЫ (editstarters.php)

<?php
session_start();
require_once '../database.php';
if (isset($_SESSION['myusername'])){
echo "Welcome ". $_SESSION['myusername'];
}
?>
<br /><br />You have uploaded the following starters:
<br /><BR />
<?php
include '../database.php';

$userid = $_SESSION["myusername"];

$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' ");

echo "<table border='1'><table border width=65%><tr><th>Recipie Name</th><th>Ingredients</th><th>Method</th><th>Time</th></tr>";
while($getrecipie = mysql_fetch_array($result))
{
        echo "<tr>";
        echo "<td>" . $recipiename = $getrecipie['recipename']. "</td>";
        echo "<td>" . $ingredients = $getrecipie['ingredients']. "</td>";
        echo "<td>" . $method = $getrecipie['method']. "</td>";
        echo "<td>" . $time = $getrecipie['time']. 'minutes'."</td>";

        ?>
      <td><a href = "startersedited.php?rec=<?php echo $getrecipie['id'] ?>" >Edit</a></td>
      <td><a href = "DELETE1.php?rec=<?php echo $getrecipie['Recipie_ID'] ?>&id=<?php echo $user_id?>" >Delete</a></td>
      <!--using the stu_id value in the URL to select the correct data when wego to the relevant pages -->
      <?php
}
echo "</tr>";
echo "</table>";
?>

СТАРТЕРЫ РЕДАКТИРОВАННАЯ СТРАНИЦА (startersedited.php)

<?php
session_start();
require_once '../database.php';
if (isset($_SESSION['myusername'])){
echo "Welcome ". $_SESSION['myusername'];
}
?>
<br /><br />EDIT/DELETE YOUR STARTERS
<br /><BR />
<?php
include '../database.php';

$userid = $_SESSION["myusername"];

$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' AND recipie_id='{$_GET['rec']}'");

$getrecipie = mysql_fetch_array($result);
$recipie = $getrecipie['recipename'];
$ingredients = $getrecipie['ingredients'];
$method = $getrecipie['method'];
$time = $getrecipie['time'];
?>
 <h1>Edit Recipies</h1>
      <p>&nbsp;</p>
      <form name="form1" method="post" action="startereditsuccess.php?rec=<?php echo $_GET['id']?>">
        <table width="609" height="250" border="0">
          <tr> 
            <td width="155">Recipie Name</td>
            <td width="347"><label for="recipiename"></label> <input type="text" name="recipename"  value="<? echo $recipe ?>" id="recipename" > 
            </td>
          </tr>
          <tr> 
            <td>Ingredients</td>
            <td><label for="ingredients"></label> <textarea name="ingredients" cols="50" rows="5" id="ingredients"><? echo $ingredients ?></textarea></td>
          </tr>
          <tr> 
            <td>Method</td>
            <td><label for="method"></label> <textarea name="method" cols="50" rows="5" id="method"><? echo $method ?></textarea></td>
          </tr>
          <tr> 
            <td>Time</td>
            <td><label for="time"></label> <input type="text" name="time" value="<? echo $time ?>" id="time"></td>
          </tr>
        </table>
        <p> 
          <input type="submit" name="update" id="update" value="Update">
        </p>
      </form>

Это ошибка, которую я получаю:

Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, логическое значение, указанное в /home/jahedhus/public_html/cook/editdelete/startersedited.php в строке 55

Пожалуйста, помогите мне, Я ПОТЕРЯЛ!

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Во-первых, не кричите в заголовках сообщений. Это не обязательно.

Во-вторых, нам не нужна стена кода, показывающая все, когда фактическим единственным значимым битом является ваше сообщение об ошибке. Это конкретное сообщение об ошибке означает, что ваш запрос не выполнен (возможно, из-за синтаксической ошибки), что означает, что mysql_query() вернул свой обычный логический FALSE, и вы не проверяли это. Вы использовали это ложное значение в качестве дескриптора оператора и попытались извлечь из него строку, что вызвало фактическое сообщение об ошибке.

Как правило, НИКОГДА не предполагайте, что запрос к базе данных выполнен успешно. Даже если сама строка запроса синтаксически допустима на 100%, существует множество других причин, которые могут привести к ее сбою.

Ваша базовая структура кода запроса MySQL должна быть:

$sql = "...";
$result = mysql_query($sql) or die(mysql_error());

Это хорошо для отладки / разработки: в случае сбоя запроса он немедленно остановит сценарий и сообщит вам, почему. Для производственного кода вам нужно что-то более надежное, чем отправка длинных сообщений об ошибках SQL своим пользователям.

0 голосов
/ 19 октября 2011

Ваш звонок на mysql_query() в startersedited.php по этой линии:

$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' AND recipie_id='{$_GET['rec']}'");

возвращает логическое значение FALSE, поскольку произошла ошибка. Вы должны добавить некоторый код обработки ошибок, чтобы справиться с этим всякий раз, когда вы вызываете mysql_query(), например:

$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' AND recipie_id='{$_GET['rec']}'");
if($result === FALSE) {
    echo "Database Error: ".mysql_error() ;
    exit ;
}
$getrecipie = mysql_fetch_array($result);

Вышесказанное, вероятно, более полезно для проверки ошибок разработки, на производственном сайте вы, вероятно, захотите зафиксировать ошибку и отобразить что-то более изящное.

Кроме того, я заметил, что вы звоните require_once '../database.php'; и include '../database.php';. Вам не нужны оба, только первый сделает.

...