1 ,php表单
当处理php表单的时候,php能把来自html页面的表单元素自动变成可供php脚本使用的数据。
比如:
<html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <form action="t3.php" method="post"> <!--action定义的是激发事件以后的下一步动作,其实也就是跳转的目标页面--> 名字: <input type="text" name="fname"> <!--用于获取用户填写的信息的文本框,表单中的name属性是php中定位数据的键--> 年龄: <input type="text" name="age"> <input type="submit" value="提交"> <!--这个是按钮--> </form> </body> </html>
你输入了<?php echo $_POST["fname"] ." and ".$_POST["age"] ?>
要注意,这不是异步操作,而是跳转到了另一个页面,所以数据不是通过request得到的,而是通过$_POST传递的,具体的道理还不得而知。
php获取单选下拉菜单中的数据:(单选框)
前端html代码
<html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <form action="t3.php" method="get"> <select name="q"> <!--这是一个有下拉列表的select,option的value属性对于html和php传递值至关重要--> <option value="">选择一个</option> <option value="1">daqingdd</option> <option value="2">dahugg</option> <option value="3">lilymm</option> </select> <input type="submit" value="提交"> </form> </body> </html>
后端的t3.php:
<?php $q=$_GET["q"] ? htmlspecialchars($_GET["q"]) : ""; //在此补充一下htmlspecialchars(),它不会改变内部参数的值,但是它会把这个值封装在html页面显示的格式中,我用var_dump()检测了一下,可以基本认为有没有这个函数都一样,大约是为了方便显示吧。 //var_dump($q); if ($q) { if($q=='1'){echo "haha daqing how are u?";} if($q=='2'){echo "hehe dahu nihao!";} if($q=='3'){echo "lily ,come on!";} } else { echo "请选择一个选项"; } ?>
多选下拉菜单中的信息如何获取?(下拉菜单好像并不能多选)
php如何获取复选框的信息?
t3.html
<html> <head> <meta charset="utf-8"> <title>daqing test</title> </head> <body> <form action="t3.php" method="post"> <!--查询方法也已经变了,用的是post--> <input type="checkbox" name="q[]" value="daqing">i am daqing<br> <!--注意复选框的定义格式,type=“checkbox”,name属性是php得到值的基础,value属性的php定义值的键,这些属性一个也不能少--> <input type="checkbox" name="q[]" value="dahu">i am dahu<br> <input type="checkbox" name="q[]" value="lily">i am lily<br> <input type="submit" value="提交"> </form> </body> </html>
t3.php:
<?php $q=isset($_POST["q"]) ? $_POST["q"] : ""; var_dump($q); //这个数组不是关联数组,数组直接是用下标排列好的。 if (is_array($q)) { $site=array( //这个数组是提前定义好的,键是前端input元素中的value,值是自己定义的 "daqing"=>"haha daqing how are u? <br>", "dahu"=>"hehe dahu nihao! <br>", "lily"=>"lily,come on!<br>", ); foreach($q as $val){//格式:“数组 as 键”,遍历数组$q的键,然后从$val中找到对应的取值。 echo $site[$val].PHP_EOL; } } else { echo "请选择一个选项"; } ?>
2,表单验证
要求:我们必须设计一个表单,包含以下字段:名字,email,url,备注和性别,除此以外,我们还要验证用户输入的信息是否有效且符合格式要求。
//纯html表示方法,t3.html
<html> <head> </head> <body> <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_self']);?>"> <!--备注下,$_SERVER是超全局变量,$_SERVER["PHP_SELF"]返回的是当前正在执行的脚本名字,所以这个页面不跳转,信息直接发到自己页面上--> <!--PHP_SELF变量据说容易被黑客攻击,所以echo $_SERVER["PHP_SELF"];这段代码要么用htmlspecialchars封装一下,要么改成:<form method="post" action="test_form.php">--> 名字:<input type="text" name="name"> <br> email:<input type="type" name="email"> <br> 网址:<input type="text" name="website"> <br> 备注:<textarea name="comment" rows="5" cols="40"></textarea> <!--这是文本域,是可以放置一整段代码的文本框--> <br> 性别:<input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男
<br>
<input type="button" name="submit" value="提交">
</form>
</body>
</html>
样子做出来了,但是缺少数据的判断和流动,这个页面就会没有灵魂,所以,这就要用到我们的php了,php当之无愧能做到和html页面完美结合,而且两者结合得具体形象,比js和ajax更加简单易行。
使用表单简单验证数据:先实现必填字段提醒的功能!
贴士:php中的trim()函数可以去除用户输入数据中不必要的字符,比如空格和tab换行等
php的stripslashes()函数可以去除用户输入的反斜杠
注意,以下代码要放在t3.php文件中,或者任意后缀是。php的文件中,html文件是不支持解析php代码的。
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>daqing test</title> <style> .error {color: #FF0000;} //这个是css中的格式的写法,即所有class=“error”的元素都具有颜色是红色的属性。 </style> </head> <body> <?php // 定义变量并默认设为空值, $nameErr = $emailErr = $genderErr = $websiteErr = ""; //事先定义一下各种error变量,留着后头显示出来 $name = $email = $gender = $comment = $website = ""; //事先给需要使用的信息找个变量名,留着后头好称呼 if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必须的。"; //如果用户没有输入名字,那就显示红色提示信息 } else { $name = test_input($_POST["name"]); //如果用户输入了名字,那就用函数处理一下,test_input是一个函数,作用在于去除用户输入的空白符号和反斜杠 } if (empty($_POST["email"])) { $emailErr = "邮箱是必须的。"; } else { $email = test_input($_POST["email"]); } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别是必须的。"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { //带形参的函数 $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 表单验证实例</h2> <p><span class="error">* 必填字段。</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"> //$_SERVER['PHP_SELF'返回脚本的名字,action=这个脚本自己,意思就是表单直接把信息发给自己就行,脚本自带了处理表单信息的程序 名字: <input type="text" name="name"> <span class="error">* <?php echo $nameErr;?></span> //此处嵌的是错误信息,如果程序没有引发错误,$nameErr就是“”空的,虽然也显示,但是值为空,如果引发了错误,使得这个变量有了值,那就会直接打印出来。下面的段落也是同样的道理 <br><br> E-mail: <input type="text" name="email"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"></textarea> <br><br> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>您的输入:</h2>"; echo $name; //注意此处,如果用户按照要求输入了信息,那变量就会如实打印出来, 虽然$name的定义和打印不在同一个<?php xxx;?>中,但是他们内部的变量应当是共享的,不然也不能分开写。 echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
除了以上功能以外,还可以添加定制化的内容,比如,我们想把验证过的用户信息放到数据库中,那么我们就可以在<body>标签的末尾添加连接数据库的代码:
<?php echo "<h2>我来试试php可否直接联系mysql</h2>"; if($name!="") { $conn = mysqli_connect("localhost", "xxx", "xxx","daqingdb"); if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } //echo "连接成功 <br>"; //测试代码的时候用的 $sql="insert into `ajax_sql`(`name`) values ('$name')"; //仅先插入一个意思意思 if (mysqli_query($conn,$sql)) { //echo "插入成功!"; } else { echo "error".mysqli_error("$conn"); } } ?>
所以php真的很好用,php不但可以跑在服务端,也可以在用户浏览器上运行。当然了,有人可能会担心我们编辑的php代码会泄露一些信息,实际上不会,比如在chrome中,我们尝试ctrl查看网页源码,发现所有php的代码根本没有显示在页面上。也是很智能了!
3,php表单:验证邮件和url(接上文实例)
php正则相关知识补充:
preg_match($pattern,$str)意思是从$str中匹配$pattern,匹配到一个符合的项目就会停止,返回1,没有匹配到任何项目就会返回0.
preg_match_all($pattern,$str,$matcharray)意思是从$str中匹配$pattern,有匹配的就放到$matcharray中,一直匹配到$str结束。
那么我们设计验证就可以采用正则:
名字name:要求用户输入只有字母和空格,$pattern匹配模式可以写作:^[a-zA-Z ]*$
邮箱email:要求用户的输入符合xxx @ xxx . xxx的格式,$pattern匹配模式可以写作:[w-]+@[w-]+.[w-]+ w表示的是:[a-zA-Z0-9],+表示的是匹配前面的字符或者字符组一次或者多次。
网址url: $pattern匹配模式可以写作:"/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i" ,额,看不大很懂,不过没什么关系,这个回头自己写也行。 注意: /b是单词分节符,模式修饰符表示忽略大小写。说句题外话,这个正则表达式可以匹配这样的url:((https://www.daqing.com,这样的也可以:::https://www.daqing.com,哇哇,更看不懂了。
比较严格地验证用户输入:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>daqing test</title> <style> .error {color: #FF0000;} </style> </head> <body> <?php // 定义变量并默认设为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { //此处的设计很精妙 if (empty($_POST["name"])) { //如果输入是空,那$nameErr等于“名字是必须的” $nameErr = "名字是必须的。"; } else { //如果不是空,那我们的$nameErr还是初始状态 $name = test_input($_POST["name"]); //我们判定以后选择赋值$nameErr为输入不合法或者不动它。 if (!preg_match("/^[a-zA-Z ]*$/",$name)){ $nameErr = "请输入字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "邮箱是必须的。"; } else { $email = test_input($_POST["email"]); if(preg_match("/[w-]+@[w-]+.[w-]+/",$email)){ $emailErr="请输入正确邮箱格式"; } } if (empty($_POST["website"])) { //网址不是必须的 $website = ""; } else { $website = test_input($_POST["website"]); if(!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)){ $websiteErr="非法的url地址"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别是必须的。"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 表单验证实例</h2> <p><span class="error">* 必填字段。</span></p> <form method="post" action="t3.php"> 名字: <input type="text" name="name"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"></textarea> <br><br> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>您的输入:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
看完表单以后我有些迷茫,因为我发现,好像js和ajax能做的东西,php也可以做,php也可以在本网页上处理并且显示信息,也可以连接查询数据库,可以验证用户输入等等,好像和js冲突,但是细想,还是不冲突的。
为什么这样说呢?php所做的交互实际上都是基于静态网页,传递数据主要靠post 和get(当然了,别的超全局变量也可以),基于用户输入和表单,如果想请求一个网页,然后返回网页的响应到本页面,php还是不可以的,只能用js。但是,不得不说,php还是比js更加直观和简洁,想在哪个html元素中输出信息就去哪个html元素中echo,比js直观。js一般是这样:document.getElementsById(“demo”).innerHTML="xxx“
4,$_GET变量详解
预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
//这是表单的html页面 <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <form action="welcome.php" method="get"> 名字: <input type="text" name="fname"> 年龄: <input type="text" name="age"> <input type="submit" value="提交"> </form> </body> </html> //当我们填写姓名为:daqing,年龄为18,点击提交的时候,url实际上是这样的: http://www.runoob.com/welcome.php?fname=daqing&age=18 //?表示分隔url和后面的信息内容,&表示分隔不同的表单元素的信息,而php在通过网络传送信息的时候,会自动把&变成&;
表单域的名称会自动成为 $_GET 数组中的键哦,所以直接这样取值就可以了:<?php echo $_GET["fname"]; ?>
5 $_POST变量详解
在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。
这个就不加代码了,因为通过post提交的信息并不会显示在url上,
表单域的名称会自动成为 $_POST 数组中的键,这样访问:<?php echo $_POST["fname"]; ?>
从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。
预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。所以用$_REQUEST也是可以的。