我正在编写一个简单的HTML / PHP网站,并且我使用post方法从表单发送信息,但它不会工作 我的第一页HTML代码是:
<div id="registrati">
<section id="main">
<h2 class="title">Per Registrarti completa questi form</h2>
<form name="reg" method="post" onsubmit='return Control()' action="Server_Add_User.php" > <!--provarlo su un pc senza problemi di xampp tutti i post vanno così-->
<p>Sesso <input type="radio" name="sesso" value="m" checked="checked"> Uomo
<input type="radio" name="sesso" value="f"> Donna
<p>Nome: <input type="text" id="nome" name="nome" placeholder="Inserisci nome"></p>
<p>Cognome: <input name="cognome" type="text" placeholder="Inserisci cognome"></p>
<p>Data di nascita (formato GG/MM/AAAA): <input type="text" name="data" placeholder="Inserisci Data di nascita"></p>
<p>Luogo di nascita: <input type="text" name="luogo" placeholder="Città di nascita"></p>
<p>Nazionalità: <input type="text" name="nazionalita" placeholder="Nazionalità"></p>
<p>Telefono: <input type="text" name="telefono" placeholder="Inserisci il tuo numero"></p>
<p>Indirizzo: <input type="text" name="indirizzo" placeholder="Inserisci il tuo indirizzo"> </p>
<p>Mail: <input type="text" name="mail" placeholder="Inserisci mail"></p>
<p>Password: <input type="password" name="pwd" placeholder="Inserisci password"></p>
<p>Ripeti Password: <input type="password" name="pwd2" placeholder="Ripeti password"></p>
</div>
<div id="pagamento">
<section id="main">
<h2 class="title">Inserisci i dati di pagamento</h2>
<p>Tipo di carta: <input type="text" name="tipo" placeholder="Visa, MasterCard, ..." size="20"></p>
<p>Numero Carta: <input type="text" name="numero" placeholder="Numero Carta" size="20"></p>
<p>Nome Titolare: <input type="text" name="nome_t" placeholder="Nome del titolare" size="20"></p>
<p>Cognome Titolare: <input type="text" name="cognome_t" placeholder="Cognome del titolare" size="20"></p>
<p>Data di scadenza: <input type="text" name="data_s" placeholder="MM/AA" size="20"></p>
<p>Codice Segreto: <input type="text" name="code_s" placeholder="Codice a 3 cifre" ></p>
<p> <a href='ToS.php'><h3>Accetto i Termini di Utilizzo</a> <input type="checkbox" name="term"></p></h3>
<br>
<br>
<br>
<input type="submit" value="Completato" style="height:50px; width: 400px">
</form>
<br>
</section>
</div>
然后在Server_add_User.php
中 <?php
include 'Function.php';
//checkifcookie();
//goToHTTPS();
if(!empty($_POST))
{
$mail = htmlentities($_POST["mail"]);
$pwd = htmlentities($_POST["pwd"]);
$nome = htmlentities($_POST["nome"]);
$cognome= htmlentities($_POST["cognome"]);
$data= htmlentities($_POST["data"]);
$luogo= htmlentities($_POST["luogo"]);
$nazionalita= htmlentities($_POST["nazionalita"]);
$telefono= htmlentities($_POST["telefono"]);
$indirizzo= htmlentities($_POST["indirizzo"]);
$tipo= htmlentities($_POST["tipo"]);
$numero= htmlentities($_POST["numero"]);
$nome_t= htmlentities($_POST["nome_t"]);
$cognome_t= htmlentities($_POST["cognome_t"]);
$data_s= htmlentities($_POST["data_s"]);
$code_s= htmlentities($_POST["code_s"]);
$sesso= htmlentities($_POST["sesso"]);
$error = '0';
if ($pwd !="" && $mail !="" && $nome!="" && $cognome !="" && $data!="" && $luogo !="" && $nazionalita !="" && $telefono !="" && $indirizzo !="" && $tipo !="" && $numero!="" && $nome_t!="" &&
$cognome!="" && $data_s!="" && $code_s!="")
{
$error = addUser($sesso,$nome,$cognome,$data,$nazionalita,$telefono,$mail, $pwd,$tipo,$numero,$nome_t,$cognome_t,$data_s,$code_s,$luogo,$indirizzo);
if($error=='0')
{
session_start();
control_session($mail);
$_SESSION['mail']=$mail;
header("refresh:3;url=index.php");
}
else{
$error = "Ci sono problemi con il server";
header("refresh:3;url=Forza_Registrazione_C.php");
}
}
else
{
$error = "I dati inseriti non sono validi ";
header("refresh:2;url=Forza_Registrazione_C.php");
}
}
else
{
$error = print_r($_POST);
}
?>
对于我的服务器,$ _POST var为空,它直接转到最后一个else并打印Array()
使用Get方法可行。 我的XAMPP配置是Apache:443,8080 - &gt;也许是8080的问题? 感谢
Ps:我只能使用PHP / HTML / JS,没有其他语言, 我尝试了一些像id标签这样的解决方案,但无论如何它都无法工作。
答案 0 :(得分:1)
如果可以,请使用 HTML5 。
<!DOCTYPE html>
<html> <!-- Add attributes as appropriate. -->
<head>
<title>My Registration Form</title>
</head>
<body>
</body>
</html>
部分<section id="main">
缺少结束标记。 <form>
name="reg"
遗漏了它的结束标记。您不应该不按顺序关闭HTML标记。我在main
部分看到了一个结束表单标记,但这种格式不正确。另外,我建议使用<label>
标记代替段落标记(<p>
)来标记您的<input>
标记。准备好后,尝试使用CSS margin
属性在HTML元素之间留出空格,而不是插入硬分隔符(<br>
)。如果您要收集电子邮件地址和电话号码,请记住,有<input type="email">
和<input type="tel">
。
如果您确实需要一个表单,请通过两个部分进行分发。这样做。
<div id="registrati">
<section id="main">
<h2 class="title">Per Registrarti completa questi form</h2>
<form name="reg" onsubmit='return Control()' method="post" action="Server_Add_User.php">
<label for"foo"><input id="foo" name="foo" type="text" value=""></label>
<!-- Add various input controls with labels. -->
<input type="hidden" name="token" value="89838374uidhyuifuih389ihfujf">
<!-- Learn to implement a CSRF token! -->
</form>
</section>
</div>
现在对其余控件使用form
属性
<div id="pagamento">
<section id="main">
<h2 class="title">Inserisci i dati di pagamento</h2>
<label for="tipo">Tipo di carta: <input id="tipo" type="text" form="reg" name="tipo" placeholder="Visa, MasterCard, ..." size="20"></label>
<!-- Add various input controls with labels. -->
</section>
</div>
此外,您还希望每个表单都有自己的令牌来阻止跨站点请求伪造攻击。使用散列函数为令牌生成value
。请勿使用 MD5 或 SHA-1 哈希算法。至少使用SHA-2,Blowfish或至少256 - 512位的东西。使用您可以学习使用的东西。
解决了一些结构性问题后,我们现在转向行为问题。
onsubmit='return Control()'
我建议您从<form>
标记中删除此标记,然后查看$_POST
超全局是否为空。如果一切正常(在完成上述更改之后),请重新应用事件处理程序。如果提交表单失败,请处理您的JavaScript。 : - )
您无需执行此操作即可将数据发送到数据库。
$mail = htmlentities($_POST["mail"]);
HTML转义功能通常用作对抗跨站点脚本(XSS)攻击的对策。当用户生成的输入传输回浏览器 时,它们会被 使用。由于数据将进入您的数据库,因此此时无需使用htmlentites()
。
至少这样做(尽管这样做有其局限性,并且本身并不安全)。
$mail = htmlentities(trim(strip_tags(trim(strip_tags(trim($_POST["mail"]))))));
此外,您可能需要考虑使用mb_strlen($string, 'UTF-8')
来确定您正在使用的数据量。
if(mb_strlen($mail, 'UTF-8') <= 254)
{
//etc ..., but you would want to define this in one place, like in a class method, or function.
}
您还可以计算成功控件的数量,以确保每次至少提交一个最小数量。最重要的是,您可以使用正确的控件名称定义一个数组。然后,使用循环,您可以确保提交的控件是正确的。毕竟,如果a)未达到正确控制数量的最小数量,或b)尚未提交正确的控制,为什么还要继续处理。在这方面,让我向您介绍我的朋友isset()
。
请阅读我对此问题的回答以获取更多信息。
现在,至于你的测试,以确保某些字段不等于空字符串,这是一件好事,但也许你可以从这个过程中做出user defined function。让函数返回true
或false
,或者只返回超级复合词AND
的结果。 :-)你仍然可以做更多的检查,但你最终会到达那里。
最后,为了帮助阻止 SQL注入攻击 ,请使用PDO预处理语句将用户数据发送到您的数据库。了解如何使用PDO。你会很高兴,因为htmlentites()
没有帮助你将用户输入发送到你的数据库。
每次返回服务器时都要注意使用相同的会话ID。了解会话固定并实施session_regenerate_id()
。
通常,它通常在session_start()
之后调用,就像这样
session_start();
session_regenerate_id();
但是,您可以使用一些决策逻辑来改进这种操作方式。
if (session_status() === PHP_SESSION_NONE) {
session_start();
} elseif (session_status() === PHP_SESSION_ACTIVE) {
session_start();
session_regenerate_id();
} else {
throw new \RuntimeException('The PHP session did not start.');
}
答案 1 :(得分:0)
你使用控制功能我无法看到这个的定义!但是如果控制返回真实表格提交正确! 所以改变你的问题并给我们更多信息,我改变了我的答案
答案 2 :(得分:0)
您的加价不对。所以你的请求实际上并没有发送。我使用代码编辑器来查找和修复问题。假设您以一种形式发送和验证注册和付款数据。请亲自看看差异。
<form name="reg" method="post" onsubmit='return Control()' action="Server_Add_User.php"> <!--provarlo su un pc senza problemi di xampp tutti i post vanno così-->
<div id="registrati">
<section id="main">
<h2 class="title">Per Registrarti completa questi form</h2>
<p>Sesso <input type="radio" name="sesso" value="m" checked="checked"> Uomo
<input type="radio" name="sesso" value="f"> Donna
<p>Nome: <input type="text" id="nome" name="nome" placeholder="Inserisci nome"></p>
<p>Cognome: <input name="cognome" type="text" placeholder="Inserisci cognome"></p>
<p>Data di nascita (formato GG/MM/AAAA): <input type="text" name="data" placeholder="Inserisci Data di nascita"></p>
<p>Luogo di nascita: <input type="text" name="luogo" placeholder="Città di nascita"></p>
<p>Nazionalità: <input type="text" name="nazionalita" placeholder="Nazionalità"></p>
<p>Telefono: <input type="text" name="telefono" placeholder="Inserisci il tuo numero"></p>
<p>Indirizzo: <input type="text" name="indirizzo" placeholder="Inserisci il tuo indirizzo"></p>
<p>Mail: <input type="text" name="mail" placeholder="Inserisci mail"></p>
<p>Password: <input type="password" name="pwd" placeholder="Inserisci password"></p>
<p>Ripeti Password: <input type="password" name="pwd2" placeholder="Ripeti password"></p>
</section>
</div>
<div id="pagamento">
<section id="main">
<h2 class="title">Inserisci i dati di pagamento</h2>
<p>Tipo di carta: <input type="text" name="tipo" placeholder="Visa, MasterCard, ..." size="20"></p>
<p>Numero Carta: <input type="text" name="numero" placeholder="Numero Carta" size="20"></p>
<p>Nome Titolare: <input type="text" name="nome_t" placeholder="Nome del titolare" size="20"></p>
<p>Cognome Titolare: <input type="text" name="cognome_t" placeholder="Cognome del titolare" size="20"></p>
<p>Data di scadenza: <input type="text" name="data_s" placeholder="MM/AA" size="20"></p>
<p>Codice Segreto: <input type="text" name="code_s" placeholder="Codice a 3 cifre"></p>
<p><a href='ToS.php'><h3>Accetto i Termini di Utilizzo</h3></a> <input type="checkbox" name="term"></p>
<br>
<br>
<br>
<br>
<input type="submit" value="Completato" style="height:50px; width: 400px">
</section>
</div>
</form>