2013-02-20 3 views
0

Медленно, но верно, я собираюсь получить AJAX. У меня есть форма, которая загружает текстовое поле и файл в базу данных. Ранее у меня был запрос на PHP, но не AJAX. Теперь работает AJAX, но не PHP. И я знаю, что некоторые из них сочтут неприемлемым загрузить изображение в BLOB, но сам запрос работает, поэтому я хотел бы сосредоточиться на проблемах, с которыми у меня возникает мой javascript, чтобы поговорить с моим PHP. Я исследовал проблему как сумасшедшую и пробовал много вещей, но то, что я ушел, заключается в том, что загрузка файлов сложна.PHP и AJAX: AJAX работает, PHP не выполняет запрос

Вопросы 1. Исправьте меня, если я ошибаюсь, но если javascript и jquery реализуют вызов «POST», переданные параметры не должны отображаться на URL страницы? Потому что они.
2. Почему мой PHP-файл не разбирает отправленные данные и не отправляет их в базу данных? Я вижу в URL-адресе и в Firebug (хотя я тоже медленно изучаю Firebug), что данные передаются. Я запустил тестовый php-файл, и я подключаюсь к базе данных с этим файлом.

Спасибо!

HTML

<!DOCTYPE html> 
<html> 
<head> 
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 
    <script src="http://code.jquery.com/jquery-migrate-1.1.1.min.js"></script> 
    <script src="jquery.validate.js"></script> 
    <script src="jquery.form.js"></script> 
    <script> 
     $(document).ready(function(){ 
      $('#addForm').validate(); 
      function addRecord() { 
       $("#aTable").hide('slow', function() { //this is not working 
        alert('Working on it.'); 
       }); 
       $("#tableText").hide('slow', function() {//this is not working 
         alert('Working on it.'); 
       }); 
       var output = document.getElementById("message"); 
       var nAname = document.getElementById("aname"); 
       var nAInfo = new FormData(document.forms.namedItem("addForm")); 
       nAInfo.append('aname', nAname); 

       $.ajax({ 
       type: "POST", 
       url: "addPhoto.php", 
       data: nAInfo 
      }); 
     }); 
    </script> 
</head> 
<body> 

<form id="addForm" name="addForm" onsubmit="addRecord()" enctype="multipart/form-data"> 
    <label>Name: </label> 
    <input type="text" id="aname" name="aname" class=required/> 
    <br> 
    <br> 
    <label>Photo: </label> 
    <input type="file" id="aimage" name="aimage" class="required"> 
    <br> 
    <br> 
    <input type="submit" value="ADD" /> 
    <br> 
</form> 

<div id="message" name="message"></div> 
<br> 
<br> 
<div id="image_display"></div> 
</body> 
</html> 

PHP

<?php 
ini_set('display_errors', 'On'); 
ini_set('display_startup_errors', 'On'); 
error_reporting(E_ALL); 

$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 

if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error; 
} 

if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

     echo $_SERVER['REQUEST_METHOD']; 

    $aname = $_POST['aname']; 
    $errorinfo = $_FILES["aimage"]["error"]; 
    $filename = $_FILES["aimage"]["name"]; 
    $tmpfile = $_FILES["aimage"]["tmp_name"]; 
    $filesize = $_FILES["aimage"]["size"]; 
    $filetype = $_FILES["aimage"]["type"]; 

    $fp = fopen($tmpfile, 'r'); 
    $imgContent = fread($fp, filesize($tmpfile)); 
    fclose($fp); 

    if (!($filetype == "image/jpeg" && $filesize > 0)) { 
     echo "Import of photo failed"; 
    } 

    if ($filetype == "image/jpeg" && $filesize > 0 && $filesize < 1048576) { 

     if (!($stmt=$mysqli->prepare("INSERT INTO actor_info (aname, aimage_data) VALUES (?,?)"))) { 
      echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error; 
     } 

     if (!$stmt->bind_param("ss", $aname, $imgContent)) { 
      echo "Binding parameters failed: (" . $stmt->errno .") " . $stmt->error; 
     } 

     if (!$stmt->execute()) { 
      echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
     } 
    $stmt->close(); 
    } 
    else { 
     echo "Image must be under 1 MB"; 
    } 

echo mysqli_error(); 
mysqli_close($mysqli); 
?> 
+1

остановка. отступите от этого кода. посмотрите, насколько он сумасшедший. вы используете jquery ... но реализуете свой ** OWN ** ajax-код? **ЗАЧЕМ**? В jquery есть замечательные и простые интерфейсы ajax, встроенные в него: http://api.jquery.com/jQuery.post/ –

+0

Также, если ваши параметры формы отображаются в URL-адресе, то вы, вероятно, не выполняете POST, это скорее всего GET. Вы можете тривиально отладить это, выполнив 'echo $ _SERVER ['REQUEST_METHOD']' в вашем php-коде. Ваш код обработки файлов является притворным. 'addslashes()' настолько дерьмовый, что даже HOPE не может стремиться к тому, чтобы его звали. ** НИКОГДА не используйте **, особенно в коде базы данных. ** НИКОГДА не предполагайте, что загрузка файла преуспела. ** НИКОГДА ** доверие данные в $ _FILES –

+0

@Marc B Я попытался следующие без успеха $ .ajax ({ типа: "POST", URL: "addActorPhoto.php", данные: nAInfo }) ; – user1852050

ответ

0
$("#aTable").hide('slow', function() { //this is not working 
      alert('Working on it.'); 
}); 

$("#tableText").hide('slow', function() {//this is not working 
      alert('Working on it.'); 
}); 

Приведенный выше код не работает, потому что у вас нет каких-либо элементов с идентификатором '#aTable' или «# tableText 'в вашем html-коде.

Попробуйте print_r ($ _ POST), чтобы узнать, попадают ли все значения на сервер или нет.

Также с помощью функции Ajax Jquery сделает ваш код проще ... ниже образец

$.ajax({ 
     url : $domain + "/index/email/" + "?" + $arguments, //add your args here... 
     cache : false, 
     beforeSend : function(){ 
      alert('sending....'); 
     }, 
     complete : function($response, $status){ 
      if ($status != "error" && $status != "timeout") { 
       if($response.responseText == "200"){ 
     alert('done'); 
       } else { 
     alert($response.responseText); 
       } 
      } 
     }, 
     error : function ($responseObj){ 
      alert("Something went wrong while processing your request.\n\nError => " 
       + $responseObj.responseText); 
     } 
    }); 
+0

Простите мою newbieness, но это '$ status', что я должен определить или является то, что ответ сервера и ничего еще не нужно делать? И ответ действует как переменная, которая устанавливает возвращаемое сообщение в назначенном месте, то есть «var response = document.getElementById (« message »);'? – user1852050

+0

В моем коде есть элементы с этими идентификаторами, но в интересах краткости я их не публиковал. – user1852050

+0

вам не нужно определять $ status, он возвращается автоматически. Также ответ будет возвращен в объекте $ response, поэтому вы можете просто ссылаться на ответ как $ response.responseText и загрузить его в свой div, как этот $ ('# message'). html ($ response.responseText); –

Смежные вопросы