【问题标题】:How to pre-fill a type="url" form field with "http://" using html or php?如何使用 html 或 php 用“http://”预填充 type="url" 表单字段?
【发布时间】:2015-09-02 21:50:28
【问题描述】:

问题:在询问用户网站的表单上,type="url" 表单字段会返回错误,除非“http://”在域名之前(甚至会出现“ www.")。

我正在寻求的结果:一种 PHP/HTML* 方法,它使用“http://”部分预填充 type="url" 字段,以便用户键入更方便用户“companywebsite.com”进入该字段并提交,没有错误。

换句话说,用户只是填写 companywebsite.com,我想用 http:// 预填写,所以最终结果是 http://companywebsite.com

<h5>Website</h5>
<input type="url" name="company_website" id="company_website" value="" />


下图是返回错误的表单条目的屏幕截图(因为“http://”不在 stackoverflow.com 域之前)。

* 我确实找到了一个 .js 方法 (https://gist.github.com/cvan/117bc1f88e4dfca6dba7) 但我是新手,刚刚学习 php

【问题讨论】:

  • 你试过value="&lt;?php echo "http://www." ?&gt;" /&gt;吗?或者只是value="http://www." /&gt;
  • 我认为这就是他想要发生的事情。 &lt;input type="url" name="company_website" id="company_website" value="http://" /&gt;
  • 我不会用它作为回答。它有效,是的,但是有很多事情可能会出错!如果用户键入不同的字符串怎么办?网络规则 1:永远不要相信用户输入!
  • 我同意@icecub。永远不要相信用户输入。如果它不存在,我会作为 php 代码在开头添加它。
  • 别打扰@Valkyrie 这是其中之一“我让它工作了,所以我不再关心”。直到有人把他的网站搞砸了,即使我们警告过他,他也会回来并期待我们为他解决这个问题。好吧,首先应该听我们的。 - 也许我这么说有点笨,但有时必须说实话。

标签: php html forms


【解决方案1】:

有几种方法可以解决这个问题:

<input type="url" name="company_website" id="company_website" value="http://" />

但是,我建议不要这样做,因为您永远不能相信用户会正确输入。相反,假设您在 php 代码中通过 POST 方法提交表单,

<?php

    if(isset($_POST['company_website'])){
        $pos = strpos($_POST['company_website'], "http://");
        if($pos != 0){
            $website = "http://".$_POST['company_website'];
        }
        // do the rest
    }
?>

【讨论】:

  • 我建议不要回答你的问题,直到他发布他的代码。没错,但作为一个初学者,他很可能不知道如何在自己的代码中实现这些。
  • 那我先删了。
  • 谢谢@J.Han 和@icecub。我使用了第一个(更简单的)选项来让它工作,稍后会尝试第二个选项。我添加了占位符文本,以防用户删除预填充的 '"http://"' - 这是最后一行代码:&lt;input type="url" name="company_website" id="company_website" value="http://" placeholder="http://yourdomain.com" /&gt; 这是结果的图像:enlightenedjobs.com/images/success-all.png(随时添加图像到您的答案,因为我无法将其上传到评论中)
【解决方案2】:

那好吧。出于学习安全性的目的,我将使用一些示例代码编写此答案,以便您知道将来如何安全地做这类事情。

首先,让我们写一个小表格:

<form method="POST" action="your_php_file.php" accept-charset="utf-8">
    <input type="url" name="company_website" id="company_website" value="" />
    <input type="submit" value="Update website" />
</form>

现在让我们开始基于此编写我们的 PHP 文件。首先,我们需要确保用户提交的是新数据而不是空字符串:

if(isset($_POST['company_website']) && !empty($_POST['company_website'])){

接下来我们将编写一个检查字符串是否为网站的函数:

function isWebsite($url){

要查看字符串是否与网站匹配,我们将使用正则表达式。正则表达式可能非常复杂,所以在这个答案的最后,我会发布一个链接来了解更多关于它们的信息。

    $pattern = '#((https?|ftp)://(\S*?\.\S*?))([\s)\[\]{},;"\':<]|\.\s|$)#i';

现在让我们编写一个简单的 if 语句,它返回 true 或 false。为简单起见,此语句将变量$url(包含用户数据)与上述$pattern 中的正则表达式模式进行比较。如果$url 包含有效的网站,它将返回 true,否则返回 false。

    if(preg_match($pattern, $url)){
        return true;
    } else {
        return false;
    }
}

接下来我们将编写一个函数,在用户发送的数据前添加“http://”:

function addHttp($url){
    $url = "http://". $url;
    return $url;
}

现在我们的功能已经完成,我们要做的就是使用它们。首先我们会检查用户是否已经发送了一个有效的网站:

if(isWebsite($_POST['company_website'])){
    //The website is valid, so you can safely add it your database here
    } else {
        //The website is not valid, but the user might simply have forgotten
        //to add http:// in front of it. So lets do it for him:
        $website = addHttp($_POST['company_website']);

        //Still we can't be sure if it's a valid website. It might be a string
        //that will try to mess with your database. So lets verify it again:
        if(isWebsite($website)){
            //The website is now valid, so you can safely add it your database here
        } else {
            //The website is still not valid, so we need to return an error
            //to your user:
            echo "It seems you didn't enter a valid website. Please try again!";
            exit;
        }
    }
}

您可能已经注意到,我们的代码中有两个地方需要编写相同的代码来插入数据库中的所有内容。您也可以为此使用函数:

function addToDatabase($url){
    //Write your code to add everything to database here. $url will contain the website
}

所以完整的代码如下:

<?php

if(isset($_POST['company_website']) && !empty($_POST['company_website'])){

    function isWebsite($url){
        $pattern = '#((https?|ftp)://(\S*?\.\S*?))([\s)\[\]{},;"\':<]|\.\s|$)#i';

        if(preg_match($pattern, $url)){
            return true;
        } else {
            return false;
        }
    }

    function addHttp($url){
        $url = "http://". $url;
        return $url;
    }

    function addToDatabase($url){
        //Write your code to add everything to database here. $url will contain the website
    }

    if(isWebsite($_POST['company_website'])){
        addToDatabase($_POST['company_website']);
    } else {
        //The website is not valid, try adding 'http://'
        $website = addHttp($_POST['company_website']);

        if(isWebsite($website)){
            addToDatabase($website);
        } else {
            //The website is still not valid, return error
            echo "It seems you didn't enter a valid website. Please try again!";
            exit;
        }
    }
}

?>

我应该补充一点,只是盲目地将网站添加到您的数据库中可能仍然不安全。为了使其绝对安全,您需要将PDO()MySQLi() 与Prepared Statements 结合使用。但是在这个答案中解释这一点会将其变成一本书。所以一定要了解它!

最后,我承诺提供一个资源来了解更多关于正则表达式的信息。最好和最安全的资源来自 PHP 官方网站本身。你可以在这里找到它:PHP: Pattern Syntax

【讨论】:

  • 我终于开始阅读@icecub 的教程(我很感激)并注意到accept-charset="utf-8" 在第一行创建表单。试图了解更多信息,我发现此页面 (htmlpurifier.org/docs/enduser-utf8.html) 说“处理 Unicode 文本时的一些经验法则:永远不要使用以下函数:...转换大小写(strtolower、strtoupper、ucfirst、ucwords)...声称不区分大小写(str_ireplace,stristr,strcasecmp)在使用函数之前要三思而后行......“我是在用accept-charset="utf-8"打开一罐蠕虫吗????
  • @MarkGavagan No. accept-charset="utf-8" 仅表示表单在发送时会将字符编码为 UTF-8。这在处理您网站上通过您的表单发送奇怪字符的访问者时非常有用。以汉字为例。我亲身经历过由于用户提交的非 utf8 字符而导致 Javascript、websockets 等崩溃的情况。这些警告是关于搞乱后端的字符。
  • @MarkGavagan 如果您使用正则表达式验证后端中的字符,就像我在function isWebsite() 中所做的那样,您可以确保它们是有效的 ASCII 字符。之后,如果需要,可以在其上使用那些特定的 PHP 函数。
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多