【问题标题】:Need Help Taking User Submitted Value and Generate Unique URL from PHP Form需要帮助获取用户提交的值并从 PHP 表单生成唯一 URL
【发布时间】:2011-06-16 05:44:37
【问题描述】:

在下面的脚本中,您将看到以“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,他们需要将值更改为可接受的值,例如作为“大房子”

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

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

哇。我希望一切都说得通。

我知道这里有几个问题,所以如果你只能协助完成一个步骤,那很好。如果您可以解决整个问题,那么您将拥有更大的力量:)

我对此进行了大量研究,我认为前两个问题应该能够用 PHP 解决,但第三个问题可能涉及某种 mod_rewrite 函数。我非常感谢您对我的查询进行了这么多,如果您能提供解决方案,非常感谢。

【问题讨论】:

  • 发帖后我意识到这个论坛帖子就是一个很好的例子。例如,我提交了整个问题,现在我有了这个可以与他人共享的唯一 URL:stackoverflow.com/questions/6367601/… 我需要知道如何从表单提交中创建这样的唯一 URL。
  • 这似乎是一个常见问题。对于 1,我认为您需要一个正则表达式。对于 2,MySQL 数据库是可以的,但可能不适合该任务。除非您对 MySQL 有其他用途,否则另一个数据库(可能是非 SQL)可能更有效。 3,关于 mod_rewrite,你是对的。您可能应该捕获所有 URL 并将它们传递给脚本以进行进一步处理。抱歉,评论太长了,但我稍后可能会写一个完整的答案。

标签: php mysql apache forms mod-rewrite


【解决方案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
}

至于确保 url 是唯一的:

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

此时,剩下的只是将 GET 变量捕获为 contact.php 中的 $_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...

我希望这会有所帮助:)

【讨论】:

  • 是的!这非常有帮助:) 在完成您提供的所有步骤后,我能够使该功能正常工作。非常感谢;)
  • 很高兴能为您提供帮助:D
【解决方案2】:

我同意怀利的观点。我也同意你(Presto)的观点,你的帖子有时有点难以获得 x)。无论哪种方式,我都会根据我对您的意思的理解,尽可能全面地回答您的问题。

1) 检查是否为单个单词的最佳方法是检查单词分隔符。最典型的单词分隔符是空格,但连字符、逗号和句点等显然也​​是分隔符。在您的情况下,确定允许什么的最佳方法是考虑什么可以正确解析为 URL,什么不能。例如,您不应允许使用加号 (+)。
您可以做几件事来防止这些中断。你可以改正,也可以拒绝。换句话说,您可以替换/删除“非法字符”而无需用户的任何额外交互/批准,或者您可以简单地将其退回给用户,说明它无效并且他们需要修复它。您可以在服务器级别 (PHP) 或客户端和服务器级别执行此操作(Javascript 用于直接检查,PHP 用于故障安全)。根据您的容忍程度,以及您是修复还是拒绝字符串,您应该使用 str_ireplace() 类型的函数,或者应该使用正则表达式 (preg_match())。在这一点上,我无法告诉您使用哪一个。

2)我不能说最好的方法是什么,因为这在很大程度上取决于您的系统设置,但如果它在您的系统中有意义,我会使用 MySQL 来完成这项任务并存储“页面”的名称directory' 在至少有两行的表中: id 和 shorturl (如您所指)。 id 应该是主键,您将使用此 id 来识别 (/JOIN) 需要在网页上显示的数据。 shorturl 列的索引应为“UNIQUE”。这样,如果您尝试在该表列中插入另一个值,MySQL 会抛出一个错误(我相信 errno 1169)。因此,您可以在用户提交表单(并且您的 PHP 代码已经检查过)后简单地运行插入查询,然后您可以检查该 errno 以查看之前是否使用过该名称。
3) 根据您设置 Web 服务器的方式,您可以做几件事。编写一个 mod_rewrite 文件当然是可能的(而且相当容易,因为您可以用 PHP 构建它并将其写入您的 Web 服务器)。您可以这样做的另一种方法是获取访问者在他/她的地址栏中键入的短网址,然后与您的数据库表进行交叉检查(如上面第二点中的那个),然后使用标题进行内部重定向PHP 中的 () 函数。

让我知道这是否有任何帮助,或者事情是否仍不清楚。

【讨论】:

    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多