2010-06-08 1 views
1

Привет, я новичок веб-программист. Мой фон записывает приложения Windows с sql.Принуждение пользователя к новой странице в php. (PHP newbie)

Я собираю свои первые экраны ввода данных в Php.

У меня есть форма поиска, которая ссылается на форму, которая отображает записи в сетке. В каждой строке сетки у меня есть URL-адрес удаления, позволяющий пользователю удалить запись. Ссылка на форму delete.php (которая вызывает sql для удаления записи).

В идеале я хотел бы автоматически вернуть пользователя в форму поиска, а не заставлять пользователя нажимать на ссылку для этого.

Я использовал ob_start с заголовком, чтобы сделать это в другом месте, но не могу заставить его работать на этой странице. Есть ли другой способ сделать это?

(с использованием PHP 5 в рамках ЛАМП) файла delete.php

<?php 
$id = $_GET['recordID']; 
//ob_start(); 
require_once('connections/local.php'); 

mysql_select_db($database_local, $local); 

mysql_query("DELETE FROM user_access WHERE id = {$id}") or die(mysql_error()); 
echo("Record ".$id." deleted"); 
echo("<br>"); 
//header("location:http://localhost/search7.htm); 
//ob_flush(); 
echo("<a href=\"http://localhost/search7.htm\">Search for Members</a>"); 

?> 
+0

Благодарим за быстрый ответ и интересные ответы. Я пошел на простейший подход, сделал без вывода на экран файла delete.php и работал нормально. Теперь я понимаю, что тег [php] + новичок возвращает много полезных вопросов. – JohnC

+0

для «дезинфекции» вашего запроса, вы должны либо '$ id = intval ($ _ GET ['recordID']);' или использовать 'mysql_real_escape_string()', как рекомендовано **, но ** обязательно помещать переменную в кавычки в запрос, '... WHERE id = '$ id'" ... 'В противном случае, без кавычек, mysql_real_escape_string ничего не поможет. Любая часть данных, которую вы помещаете в запрос, должна обрабатываться следующим образом: –

ответ

0

При отправке Location заголовок, нет никаких оснований echoничего в браузере, так что вы могли бы также exit() сразу:

<?php 
$id = mysql_real_escape_string($_GET['recordID']); 
require_once('connections/local.php'); 
mysql_select_db($database_local, $local); 

mysql_query("DELETE FROM user_access WHERE id = '$id'") or die(mysql_error()); 

header("Location: http://localhost/search7.htm"); 
exit(); 
?> 

ВАЖНО: Вы также уязвимы для SQL injection (фиксированная выше через mysql_real_escape_string)

+0

OMG newbies снова наносит удар. Вы ничего не исправили. –

+0

Вы имели в виду прокомментировать другой ответ? Этот ответ устраняет два вопроса. – Dolph

+0

Нет, я хотел прокомментировать этот очень неосведомленный ответ. Никакая инъекция не была исправлена. –

0

Что было не так с этой линии, прежде чем вы прокомментировали это?

//header("location:http://localhost/search7.htm); 

Это приводит к отключению браузера на другой странице. Два других варианта, хотя (оба идут в <head>):

  • Javascript:

    <script type="text/javascript">document.location.href = "http://url";</script> 
    
  • Мета обновления:

    <meta http-equiv="REFRESH" content="0;url=http://url" /> 
    
+0

Я думаю, вы не можете echo anything перед header(). – Babiker

+1

Там также есть код выходного буфера (счётчик этой проблемы). OP уже прошел через это. – Oli

3

Во-первых, у вас есть проблемы инъекции SQL , Всегда дезинфицировать вашу форму ввода:

$id = mysql_real_escape_string($_GET['recordID']); 

Во-вторых, вы можете использовать метод header() для перенаправления пользователя:

header('Location: http://localhost/search7.htm'); 

, но вы можете сделать это, только если вы не послали какой-либо вывод Пользователь. По этой причине вы часто увидите людей, использующих выходные буферы, чтобы дать им возможность выполнять перенаправление HTTP. По этой причине я найти такую ​​функцию, как это полезно:

function redirect($url) { 
    while (ob_end_clean()) { 
    // do nothing 
    } 
    header("Location: $url"); 
} 

Таким образом, вы можете сделать это:

<?php 
ob_start(); 
echo "...some html..."; 
header('Location: /new/url.html'); // this will fail 
redirect('/new/url.html'); // this will succeed 
... 

Если вы хотите, чтобы отобразить страницу временно попробовать выводить что-то вроде этого:

<html> 
<head> 
    <meta http-equiv="refresh" content="15; url=http://localhost/search7.htm"> 
    <title>Delete Record</title> 
</head> 
<body> 
    <p>You have deleted a record.</p> 
    <a href="http://localhost/search7.htm"><<< Back</a> 
</body> 

Это автоматически перенаправит пользователя через 15 секунд, если до этого он не нажимает обратную ссылку.

+0

Согласитесь с большинством, но не можете удержаться от комментариев об ошибке: Собственно, в силу буферизация вывода (ob_start()), вы можете использовать заголовок («Местоположение: ...»); 'как вы описали, и он преуспевает. Он будет использовать код 301 или 302 как обычно, и только 1xx, 204 и 304 не включают тело сообщения (см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3), остальные могут но за 301-е и 302-е годы его явно редко видели. Не нужно «очищать» выход. – Wrikken

+0

@Col. Оскорбительные люди не дают вам никаких аргументов. – Yacoby

+0

@Col. [sanitize] (http://www.merriam-webster.com/dictionary/sanitize): «сделать более приемлемым, удалив неприятные или нежелательные функции». Ergo mysql_real_escape_string дезактивирует ввод. – Yacoby

0

код, который вы должны работать, как Клетус предложил, но вам нужно положить //header("location:http://localhost/search7.htm);, прежде чем эхо/печать ничего (HTML код, PHP код, и т.д.) на странице, потому что это будет означать, что заголовки уже отправлены. Его лучше объяснить here.

0

Я рекомендую изучить решение AJAX. Таким образом, вы можете удалить запись, не отвлекаясь от страницы поиска. Хорошая библиотека javascript сделает операцию довольно простой, и это будет интересный и интересный проект для кого-то нового для веб-разработки.

0

Два возможных улучшений, не упомянутые в предыдущих ответах:

  1. Я предложил бы использовать POST обработать ваши изменения базы данных вместо GET. Таким образом, вы избежите случайных удалений, если у кого-то установлен какой-либо веб-ускоритель (программа, которая предварительно выбирает веб-страницы, следуя/загружая все ссылки на странице).
  2. О проблеме с уязвимостью в sql-инъекции; если вы говорите о числовом идентификаторе, я бы использовал (int) $_GET['recordID'] или intval($_GET['recordID']), чтобы убедиться, что идентификатор является целым числом. Не требуется mysql_real_escape_string().
Смежные вопросы