Ajax和PHP特殊问题

时间:2017-07-16 18:04:41

标签: ajax

当我发送一个表单包含来自没有specialchars的输入的数据时,它会到达PHP文件并轻松地在DB中设置。 选择时,也没有任何问题。

但是,当用户键入下一个键时,事情就不同了: &#34;或者&#39;或<script>或提醒(&#39;是&#39;);或\或$等等等等。

我尝试了什么: 使用大量的encodeURI或encodeURIComponent函数或JSON.stringify 或者escapeHTML和我没想过的...... 但没有任何作用。 最有问题的是:<script>或提醒(&#39;是&#39;); 不仅没有被发送到PHP文件,他们卡住了整个页面!

注意:现在我已经注意到即使在stackoveflow中,当我在代码括号中写入<script>标记时,stackoverflow也不会显示任何内容!

现在,某些字符串,不知何故,最终被传递到php文件, 但是当我试图存储它们时,我也有一个持续的问题: 它们是json编码的,所以我不会对每个对象键执行一些长而耗时的函数,如htmlspecialchars / mysqli_real_escape_string / htmlentities或其他..像这样工作将是非常不舒服....

html / php第一页的一个例子:

<div class="contact-form">
      <form ng-submit="processForm()" class="default-form">
        <div class="row">
          <div class="col-lg-3">
            <label for="">* שם פרטי ושם משפחה</label>
            <input type="text" required ng-model="formData.full_name" placeholder="* שם פרטי ושם משפחה">
                    </div>
          <div class="col-lg-3">
            <label for="">* כתובת דוא׳׳ל</label>
            <input type="text" required ng-model="formData.email" placeholder="* כתובת דוא׳׳ל">
                    </div>
          <div class="col-lg-3">
            <label for="">* טלפון</label>
            <input type="text" required ng-model="formData.phone" placeholder="* טלפון">
                    </div>
          <div class="col-lg-3">
            <label for="">* סוג קבלן</label>
            <select required ng-model="formData.type">
              <option value="">* סוג קבלן</option>
              <option value="פרטי" alt="">פרטי</option>
              <option value="יזם" alt="">יזם</option>
              <option value="בנייה ציבורית" alt="">בנייה ציבורית</option>
            </select>
                    </div>
          <div class="col-lg-12">
            <label for="">
              העלאת קבצים
            </label>
            <input type="file" ng-file-model="formData.files" name="files" multiple style="margin-top:15px">
          </div>
          <div class="col-lg-12" style="margin-top:40px">
            <input type="checkbox" ng-model="formData.newsletter" id="newsletter" >
            <label for="newsletter">קבל מבצעים ועדכונים במייל</label>
          </div>
          <div class="col-lg-12" style="margin-top:10px">
            <button class="thm-btn bg-clr1" style="color:white; font-weight:bold" type="submit">לשליחה לחץ כאן</button>
            <h3 class="loader" style="display:none">טוען ומעלה קבצים...</h3>
          </div>
                </div>
      </form>

如你所见,只是另一种基于角度的形式。

现在是JS文件:

$scope.formData = {
  full_name: "raz",
  phone: "0509921014",
  email: "razwebs@gmail.com",
  type: "בנייה ציבורית",
  newsletter: true,
  files: "",
};

$scope.processForm = function() {
  $(".bg-clr1").hide();
  $(".loader").show();
  var data = new FormData();
  if ($scope.formData.files.length>0)
  {
    var files = $scope.formData.files;
    for (var k=0; k<files.length; k++)
      data.append("file-"+k, files[k]);
  }
  var formData = JSON.stringify($scope.formData);
  formData = encodeURIComponent(formData);
  $.ajax({
    type: 'POST',
    url: 'send_quote.php?formData=' + formData,
    cache: false,
    contentType: false,
    processData: false,
    data: data,
    success: function(response) {
      console.log(response);
      $(".bg-clr1").show();
      $(".loader").hide();
      //window.location = "thanks.php";
    }
  });
};

请注意,在这个js文件中,我还发送post和get,哪个帖子是FormData对象包含的文件,而get包含常规字符串。

最后是php页面:

$array = $_FILES;
$files = [];
for ($i=0; $i<count($array); $i++)
{
  $file = $_FILES["file-" . $i];
    $name = $file["name"];
    $fileType = $file["type"];
    $tmp_name = $file["tmp_name"];

    $ext = pathinfo($name, PATHINFO_EXTENSION);
    $ext = strtolower($ext);
    $fileId = rand(1,10000000);
    $dir = "admin/uploads/";
    $randName = $dir . $fileId . "." . $ext;

    move_uploaded_file($tmp_name, $randName);
  array_push($files, $randName);
}
$formData = urldecode($_GET['formData']);
$fd = json_decode($formData, true);
$fd["files"] = $files;
$fd = json_encode($fd, JSON_UNESCAPED_UNICODE);

$theDate = time();
mysqli_query($con, "INSERT INTO quotes
(
  `quote`,
  `status`,
  `date`
)
VALUES
(
  '$fd',
  0,
  '$theDate'
)
");

希望看起来很清楚,我真的花了很多时间来解决这个问题, 没有用,它真的很沮丧,我确信其他人也面临同样的问题......

如果有人可以提供帮助,那就太棒了,对中级英语抱歉。

谢谢!

0 个答案:

没有答案