我在php中开发了一个表单,允许用户提交一个简单的作业应用程序。 在将用户输入发送到我的数据库之前,我会对我的数据进行测试和验证。
["var1"]=> int(1) 7
["var2"]=> int(0) null
我用来清理用户输入的函数如下所示:
<?php
$geslachtErr = $voornaamErr = $familienaamErr = $emailErr = $telErr = $afileErr = "";
$geslacht = $voornaam = $familienaam = $email = $tel = $afile = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["geslacht"])) {
$geslachtErr = "geslacht is required";
} else {
$geslacht = test_input($_POST["geslacht"]);
}
if (empty($_POST["voornaam"])) {
$voornaamErr = "voornaam is required";
} else {
$voornaam = test_input($_POST["voornaam"]);
// check if voornaam only contains letters and whitespace
if (!preg_match("/^[a-zA-Z ]*$/",$voornaam)) {
$voornaamErr = "Only letters and white space allowed";
}
}
我的HTML看起来像这样:
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
如果我做了一个测试并<form method="post" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?> >
<div class="top-row">
<div class="field-wrap">
<p><span class="error">* verplichte velden.</span></p>
<label>Geslacht</label><span class="error">* <?php echo $geslachtErr;?></span>
<select name="geslacht" value="<?= isset($_POST['geslacht']) ? $_POST['geslacht'] : ''; ?>">>
<option value=""></option>
<option value="man">man</option>
<option value="vrouw">vrouw</option>
</select>
</div> <!-- /field-wrap-->
<div class="field-wrap">
<label>Voornaam</label><span class="error">* <?php echo $voornaamErr;?></span>
<input type="text" name="voornaam" value="<?= isset($_POST['voornaam']) ? $_POST['voornaam'] : ''; ?>">
</div> <!-- /field-wrap-->
我所有的字段都以相同的形式获得了所有结果。
但我希望将这些数据发送到mysql数据库。 所以我将PDO与Prepared Statement一起使用。该文件名为dbcon.php
echo
现在这肯定是我出错的地方,但我无法弄清楚我做错了什么。
当我想将用户输入发送到我的mysql数据库时,我从
更改了我的html中的操作<?php
$servername = "xxxxxx";
$username = "xxxxxx";
$password = "xxxxx";
try {
$conn = new PDO("mysql:host=$servername;dbname=xxxxx", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO sollicitatie_form (geslacht, voornaam, familienaam, email, tel)
VALUES (:geslacht, :voornaam, :familienaam, :email, :tel)");
$stmt->bindParam(':geslacht', $geslacht);
$stmt->bindParam(':voornaam', $voornaam);
$stmt->bindParam(':familienaam', $familienaam);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':tel', $tel);
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn->null;
到
<form method="post" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?> >
当我提交数据时,我得到所有&#34; NULL&#34;在我的数据库中......
与我的mysql数据库的连接正在运行。我已经对它进行了双重测试。 我非常确定sanatizing和验证是正确的,因为我在本地测试它(没有发送到mysql db)我得到了所有正确的信息。
那么我做错了什么?
答案 0 :(得分:0)
那么我做错了什么?
不存储预编码在db中的内容。就此而言,不要消毒输入,验证&amp;编码。如果您的意思是test_input
,请不要将其称为sanitize_input
- 而是将其称为sanitize_input
。并且不要使用stripslashes ,它不适合任何事情。如果你需要html编码的东西,使用htmlspecialchars(或htmlentities),如果你需要为SQL编码,使用PDO :: quote,如果你需要为shell参数编码,请使用escapeshellarg。如果你需要为正则表达式编码,请使用preg_quote, never stripslashes,它唯一有用的是破坏你的数据。
html编码任意字符串的正确方法:
function hhb_tohtml(string $str): string {
return htmlentities ( $str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true );
}
(可选择用htmlspecialchars替换htmlentities,但输入参数相同)
从不这样做:
action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>
如果您希望POST转到当前页面,只需完全省略action属性即可。在大多数情况下,最好让浏览器自己决定编码类型(浏览器通常会在文件更新时选择enctype="multipart/form-data"
,而在没有文件上传时通常选择application / x-www-urlencoded,这通常是聪明的事情,因为multipart具有大量的元数据开销,但实际文件内容开销为0,而urlencoded具有最小的元数据开销,但是编码二进制数据的开销很大(高达原始二进制文件大小的300%),哪些文件通常是由。浏览器选择自己,除非你有充分的理由不这样做。)
至于你为什么得到NULL,看看这里
$stmt->bindParam(':geslacht', $geslacht);
你永远不会定义$ geslacht,你需要的是
$stmt->bindParam(':geslacht', $_POST['geslacht']);
也许我错过了什么,但我没时间了