Нужна помощь, принимая введенное пользователем значение и генерировать уникальный URL из формы PHP - PullRequest
1 голос
/ 16 июня 2011

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

Вот форма, в которую пользователь отправляет данные:

    <html>
    <body>

    <p>Required fields are <b>bold</b></p>

    <form action="contact.php" method="post">
<p><b>Author's Name:</b> <input type="text" name="author" /><br />
<p>Company Name: <input type="text" name="company" /><br />
<p>Address:<br /><textarea name="address" rows="5" cols="40"></textarea></p>
<p>Phone Number: <input type="text" name="phone" /><br />
<b>Title:</b> <input type="text" name="title" /><br />
<p><b>One Word Description:</b> <input type="text" name="shorturl" /><br />
<p><b>Full Description:</b><br />
<textarea name="comments" rows="10" cols="40"></textarea></p>

<p><input type="submit" value="submit"></p>

<p> </p>

</form>

</body>
</html>

Следующий бит кода - это страница contact.php, которая выведет пользовательские данные:

<?php


/* Check all form inputs using check_input function */
$author = check_input($_POST['author'], "Enter your name");
$company = check_input($_POST['company']);
$address = check_input($_POST['address']);
$phone = check_input($_POST['phone']);
$shorturl = check_input($_POST['shorturl'], "Provide a single word description");
$title  = check_input($_POST['title'], "Write a title");
$comments = check_input($_POST['comments'], "Provide a full description");




/* Functions we used */
function check_input($data, $problem='')
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if ($problem && strlen($data) == 0)
{
    show_error($problem);
}
return $data;
}

function show_error($myError)
{
?>
<html>
<body>

<b>Please correct the following error:</b><br />
<?php echo $myError; ?>

</body>
</html>
<?php
exit();
}
?>

<head>
    <title><?php echo $_POST['title']; ?></title>
</head>
<body>

<p>
<b><?php echo $_POST['title']; ?></b><br>
Created by:<br> 
<?php echo $_POST['author']; ?><br>
<?php echo $_POST['company']; ?><br>
Contact: <br>
<?php echo $_POST['phone']; ?><br>
<?php echo $_POST['address']; ?><br>
Flyer Description: <br>
<?php echo $_POST['comments']; ?><br>
</p>

</body>
</html>

Как вы увидите, если вы запустите эту форму, функция довольно проста. Здесь мне нужна помощь. В первоначальном виде берется значение shorturl. Функция значения shorturl выглядит следующим образом:

Если бы эта форма была размещена на examplesite.com, то мне бы очень хотелось, чтобы созданная форма была доступна с отправленными ответами на examplesite.com/shorturl

.

Прежде всего, как мне проверить, что это на самом деле одно слово через PHP? Если пользователь отправляет значение shorturl как «Дом», тогда мне нужно, чтобы форма возвращала значение как «истина», но если пользователь отправляет «Большой дом», тогда значение равно «Ложь», и ему нужно изменить значение на что-то, что приемлемо, например, как "BigHouse"

Во-вторых, мне нужно убедиться, что значение shorturl уникально для сайта. Другими словами, после использования shorturl это значение необходимо отправить в базу данных MySQL, чтобы оно не было реплицировано другим пользователем. Чтобы продолжить наш пример, если у кого-то уже есть значение «House» в качестве значения shorturl, тогда полный URL-адрес examplesite.com/House уже занят. Затем, если новый пользователь приходит и пытается использовать «Дом», отправка выдаст сообщение об ошибке, в котором говорится, что имя занято.

И, наконец, как мне получить всю эту информацию для автоматического создания уникальной веб-страницы с результатами формы? Для примера давайте продолжим examplesite.com/House Прямо сейчас, когда пользователь отправляет форму, данные отображаются на examplesite.com/contact.php. Как создать URL-адрес, который будет отображать данные формы и быть уникальным в соответствии с определением shorturl и быть доступным для просмотра стороннему посетителю сайта без отправки новых данных?

Wow. Я надеюсь, что все имеет смысл.

Я знаю, что здесь есть несколько вопросов, так что, если вы можете помочь только одним шагом, это нормально. Если вы можете решить всю эту проблему, тогда у вас будет больше сил:)

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

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Это должно хорошо справиться с проверкой $ shorturl:

if (preg_match('/[^a-z0-9]/i', $shorturl)) {
    // $shorturl contains characters other than just numbers or
    // letters such as a tab, space, or special chars you probably don't want
}

Как убедиться, что URL уникален:

if (!mysql_num_rows(mysql_query("SELECT id FROM contact WHERE url = '$shorturl' LIMIT 1")) {
    // it is unique, yay    
}

И вы бы вставили URL так:

mysql_query("INSERT INTO contact (url) VALUES ('$shorturl')");

Что касается автогенерации контента, это не должно быть таким хитрым. Во-первых, вам нужно будет вставить все данные формы в базу данных, я сделаю это в то же время, когда вы вставите URL. Для динамического извлечения данных (с использованием такого короткого URL-адреса) вам потребуется выполнить небольшую модификацию .htaccess.

Вот пример того, как ваш .htaccess может выглядеть для пользователя, чтобы он мог перейти на domain.com/shorturl, в то время как действующие скрипты (и то, что они увидят) находятся по адресу domain.com/contact. PHP? SHORT_URL = SHORTURL

RewriteEngine on  

# don't rewrite if the file exists
RewriteCond %{REQUEST_FILENAME} !-f
# don't rewrite if the directory exists
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ contact.php?short_url=$1

На данный момент остальное просто захватывает переменную GET как $ _GET ['short_url'] в файле contact.php (или в любом месте, где вы хотите, чтобы этот сценарий находился, если вы соответственно измените RewriteRule) и возвращает остаток информация, которую вы захватили с помощью запросов к базе данных, может быть что-то вроде:

$short_url = mysql_real_escape_string($_GET['short_url']);

$sql = "SELECT * FROM contact WHERE url = '$short_url'";
$user_data = mysql_fetch_array(mysql_query($sql));

extract($user_data);
// with extract, all of $user_data's keys are now variables and their respective values
// are contained within those variables
// $user_data['company'] now becomes simply $company, for example

echo "Company: $company";
// etc...

Надеюсь, это поможет:)

0 голосов
/ 16 июня 2011

Я согласен с Уайли. Я также согласен с вами (Престо), что ваш пост иногда бывает трудно получить x). В любом случае, я постараюсь ответить на ваши вопросы как можно полнее, исходя из того, что я понимаю, что вы имеете в виду.

1) Лучший способ проверить, является ли это одним словом, проверяя разделители слов. Наиболее типичным разделителем слов является пробел, но такие вещи, как дефисы, запятые и точки, очевидно, также являются разделителями. В вашем случае лучший способ определить, что разрешить, - это рассмотреть, что будет правильно обрабатываться как URL, а что нет. Например, вы не должны позволять использовать знак плюс (+).
Вы можете сделать несколько вещей, чтобы предотвратить подобные перерывы. Вы можете либо исправить это, либо отказаться от него. Другими словами, вы можете либо заменить / удалить «недопустимые символы» без какого-либо дополнительного взаимодействия / одобрения пользователя, либо вы можете просто отослать его обратно пользователям, заявив, что они недействительны и что им нужно будет это исправить. Вы можете сделать это на уровне сервера (PHP) или на уровне клиента и сервера (Javascript для прямой проверки и PHP как отказоустойчивый). В зависимости от того, насколько вы будете терпимы и будете ли вы исправлять или отклонять строку, вы должны либо использовать функцию типа str_ireplace (), либо использовать regexp (preg_match ()). На данный момент я не могу сказать вам, какой из них использовать.

2) Я не могу сказать, каков наилучший способ сделать это, поскольку это очень сильно зависит от настроек вашей системы, но если бы это имело смысл в вашей системе, я бы использовал MySQL для этой задачи и сохранил бы имена страниц directory 'в таблице, состоящей как минимум из двух строк: id и shorturl (как вы на это ссылаетесь). Идентификатор должен быть первичным ключом, и вы будете использовать этот идентификатор для идентификации (/ JOIN) данных, которые необходимо отобразить на веб-странице. Столбец shorturl должен быть индексирован как UNIQUE. Таким образом, если вы попытаетесь вставить другое значение в этот столбец таблицы, MySQL выдаст вам ошибку (я считаю, что errno 1169). Из-за этого вы можете просто выполнить запрос на вставку после того, как пользователь отправил вашу форму (и ваш PHP-код проверил ее), а затем вы можете просто проверить это с ошибкой, чтобы увидеть, использовалось ли имя раньше.

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

Дайте мне знать, помогло ли это, или все еще неясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...