准备语句PDO给出NULL结果n DB

时间:2017-06-14 19:13:53

标签: php mysql pdo

我在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)我得到了所有正确的信息。

那么我做错了什么?

1 个答案:

答案 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']);

也许我错过了什么,但我没时间了