需要帮助获取用户提交的值并从PHP表单生成唯一的URL

时间:2011-06-16 05:44:37

标签: php mysql apache forms mod-rewrite

在下面的脚本中,您将看到以“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值提交为“House”,那么我需要表单将值返回true,但如果用户提交“Big House”,则值为false,并且需要将值更改为可接受的值作为“BigHouse”

其次,我需要验证shorturl值是否为站点所特有。换句话说,一旦使用了shorturl,该值就需要发送到MySQL数据库,以便其他用户不会复制它。继续我们的示例,如果有人已经将“House”作为其shorturl值,那么examplesite.com/House的完整URL已经被采用。然后,如果新用户来到并尝试使用“House”,则提交将生成一条错误消息,指出该名称已被删除。

最后,如何获取所有这些信息以自动生成带有表单结果的唯一网页?举个例子,让我们继续examplesite.com/House 现在,当用户提交表单时,数据显示在examplesite.com/contact.php上。如何生成一个URL,该URL将显示表单数据并且由shorturl定义为唯一,并且可以在不提交新数据的情况下查看第三方站点访问者?

哇。我希望一切都有道理。

我知道这里有几个问题,所以如果你只能协助一步就好了。如果你能解决这整个问题,那么对你有更大的权力:)

我已经对此进行了大量研究,我认为前2个问题应该可以用PHP解决,但第三个问题可能涉及某种类型的mod_rewrite函数。我不能完全感谢你用我的查询来解决这个问题,并且非常感谢你能提供解决方案。

2 个答案:

答案 0 :(得分:1)

这应该可以很好地验证$ 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
}

至于确保网址是唯一的:

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

你会像这样插入网址:

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

此时剩下的就是在contact.php中捕获GET变量$ _GET ['short_url'](或者你希望这个脚本驻留的任何地方,只要你相应地更改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...

我希望这会有所帮助:)

答案 1 :(得分:0)

我同意Wylie的观点。我也同意你(Presto)你的帖子有时很难得到x)。无论哪种方式,我都会根据我的理解,尽可能完整地回答您的问题。

1)检查单词是否是单个单词的最佳方法是检查单词分隔符。最典型的单词分隔符是空格,但连字符,逗号和句点等内容显然也是分隔符。在您的情况下,确定允许哪些内容的最佳方法是考虑将哪些内容正确解析为URL,哪些内容不会。例如,您不应该允许使用加号(+) 你可以做几件事来防止这种类型的休息。你可以纠正它,也可以拒绝它。换句话说,您可以替换/删除“非法字符”而无需用户进行任何其他交互/批准,或者您可以简单地将其退回给用户,说明它无效并且他们需要修复它。您可以在服务器级别(PHP)或客户端和服务器级别执行此操作(Javascript用于直接检查,PHP用作故障安全)。根据您的容忍程度,以及是否修复或拒绝字符串,您应该使用str_ireplace()类型的函数,或者您应该使用regexp(preg_match())。在这一点上,我无法告诉你使用哪一个
2)我不能说最好的方法是什么,因为这在很大程度上取决于你的系统设置,但如果它在你的系统中有意义,我会用MySQL来完成这个任务并存储'page的名字目录'在一个至少有两行的表中:id和shorturl(正如你所指的那样)。 id应该是主键,您将使用此id来标识(/ JOIN)需要在网页上显示的数据。 shorturl列应该索引为'UNIQUE'。这样,如果您尝试在该表列中插入另一个值,MySQL将向您抛出错误(我相信错误1169)。因此,您只需在用户提交表单后运行插入查询(并且您的PHP代码已经检查了它),然后您可以检查该错误以查看该名称是否已被使用过。

3)根据您设置Web服务器的方式,您可以执行多项操作。编写mod_rewrite文件当然是可能的(而且相当简单,因为您可以在PHP中构建它并将其写入您的Web服务器)。另一种方法是获取访问者在他/她的地址栏中输入的shorturl,然后与您的数据库表交叉检查(如上面第2点的那个),然后使用标题进行内部重定向PHP中的()函数。

如果有任何帮助,或者事情仍然不清楚,请告诉我。