Ajax проблема с отправкой post запроса

Статус
В этой теме нельзя размещать новые ответы.

mr-graffity

Профессор
Регистрация
29 Июл 2010
Сообщения
189
Реакции
43
Есть скрипт на ajax который отправляет пост запрос php скрипту на выборку из sql базы данных.
В ajax скрипте форма для редактирования заполняется полученными данными.
После изменения содержимого нужно отправить данные обратно php скрипту чтоб он обновил данные в базе.
Запрос на выборку прекрасно отправляется и форма отлично заполняется но вот запрос на обновление не уходит.
Помогите не могу разобраться в чем дело.
Вот ajax скрипт
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>search</title>
<link rel="stylesheet" type="text/css" href="my.css">
 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
 
$(function() {
 
    $(".search_button").click(function() {
        // получаем то, что написал пользователь
        var searchString    = $("#search_box").val();
        // формируем строку запроса
        var data            = 'search='+ searchString;
 
        // если searchString не пустая
        if(searchString) {
            // делаем ajax запрос
            $.ajax({
                type: "POST",
                url: "do_search.php",
                data: data,
                dataType: "json",
                success: function(data)
                { // запустится после получения резуотатов
                    $("#results").show();
                    $("#resultID").text(data.id);
                    $("#resultINT").text(data.introtext);
                    $("#resultFUL").text(data.fulltext);
                   
              }               
            });
        }
        return false;
    });
    $(".edit_button").click(function() {
        // получаем то, что написано в формах
        var StringID    = $("#resultID").val();
        var StringINT    = $("#resultINT").val();
        var StringFUL    = $("#resultFUL").val();
        // формируем строку запроса
        var data            = 'StringID='+ StringID+'&StringINT='+StringINT+'&StringFUL='+StringFUL;
 
        // если StringID не пустая
        if(StringID) {
            // делаем ajax запрос
            $.ajax({
                type: "POST",
                url: "do_search.php",
                data: data,
                dataType: "json",
                success: function(data)
                { // запустится после получения резуотатов
                    $("#results").empty();
                    $("#results").show();
                    $("#resultID").text(data.id);
                    $("#resultINT").text(data.introtext);
                    $("#resultFUL").text(data.fulltext);
                   
              }   
            });
        }
        return false;
    });   
});
</script>
 
 
</head>
<body>
<h3 style="text-align:center;">Попробуйте ввести фразу</h3>
<div id="container">
<div style="margin:20px auto; text-align: center;">
<form method="post" action="do_search.php">
    <input type="text" name="search" id="search_box" class='search_box'/>
    <input type="submit" value="Поиск" class="search_button" /><br />
</form>
</div>
<div>
 
<div id="searchresults">Результаты для <span class="word"></span></div>
<ul id="results" class="update">
<form id="editor" method="post" action="<? $PHP_SELF ?> " method=post enctype=multipart/form-data  width="50%" height="50%"><p>ID<br/><textarea id="resultID" name="resultID" rows="1" cols="5" id="resultID" class="resultID"></textarea></p><p>Анонс<br/><textarea id="resultINT" name="resultINT" rows="8" cols="100" id="resultINT" class="resultINT"></textarea></p><p>Статья<br/><textarea id="resultFUL" name="resultFUL" rows="8" cols="100" id="resultFUL" class="resultFUL"></textarea></p><p><input type="submit" class="edit_button"/></p></form>
</ul>
 
</div>
</div>
 
</body>
</html>
Вот скрипт на php который обрабатывает
Код:
<?php
//получаем данные через $_POST
if (isset($_POST['search'])) {
    // подключаемся к базе
    include('db.php');
    $db = new db();
    // никогда не доверяйте входящим данным! Фильтруйте всё!
    $word = mysql_real_escape_string($_POST['search']);
    // Строим запрос
    $sql = "SELECT * FROM `jos_content` WHERE `fulltext` LIKE '%" . $word . "%' or `introtext` LIKE '%" . $word . "%' or 'state' LIKE '1' LIMIT 0 , 30";   
   
    // Получаем результаты
    $row = $db->select_list($sql);
    if(count($row)==1) {
    $q = mysql_query($sql);
    $res = mysql_fetch_assoc($q);
    echo json_encode($res);
        } else {
        echo '<li>Не уникальный запрос!</li>';
    }       
}
if (isset($_POST['resultID'])) {
    // подключаемся к базе
    include('db.php');
    $db1 = new db();
    // никогда не доверяйте входящим данным! Фильтруйте всё!
    $resultID = mysql_real_escape_string($_POST['resultID']);
    $resultINT = mysql_real_escape_string($_POST['resultINT']);
    $resultFUL = mysql_real_escape_string($_POST['resultFUL']);
    // Строим запрос   
    $sql = "UPDATE `jos_content` SET `introtext` = '".$resultINT."',`fulltext` = '".$resultFUL."' WHERE `jos_content`.`id` = ".$resultID;
    // Получаем результаты   
    $q = mysql_query($sql);
    //echo $sql.'<li>Обновили!</li><br>';
    $sql1 = "SELECT * FROM `jos_content` WHERE `jos_content`.`id` = ".$resultID;   
    $q1 = mysql_query($sql1);
    $res1 = mysql_fetch_assoc($q1);
    echo json_encode($res1);
    }
 
?>
Вот скрипт подключения к joomla базе
Код:
<?php
  class db {
 
    function __construct()
    {
        global $dbh;
        if (!is_null($dbh)) return;
        $dbh = mysql_pconnect('localhost', 'root', '');
        mysql_select_db('stroydump');
        mysql_query('SET NAMES utf8');
    }
 
    function select_list($query)
    {
        $q = mysql_query($query);
        if (!$q) return null;
        $ret = array();
        while ($row = mysql_fetch_array($q, MYSQL_ASSOC)) {
            array_push($ret, $row);
        }
        mysql_free_result($q);
        return $ret;
    }   
  }
?>
 
попробуйте выполнить запрос $(".edit_button ").click(function()
используя метод live()
$(".edit_button").live("click", function()....
данные, полученные после загрузки контента страницы, в частности посредством ajax запроса не подхватываются яваскриптами... их можно активировать только используя live() или bind()
Для просмотра ссылки Войди или Зарегистрируйся
кроме того немного смущает этот кусок кода:
PHP:
      // формируем строку запроса
        var data            = 'StringID='+ StringID+'&StringINT='+StringINT+'&StringFUL='+StringFUL;
 
        // если StringID не пустая
        if(StringID) {
чего вдруг проверка на StringID если переменная - data, вот на её наличие и нужно проверять...
 
попробуйте выполнить запрос $(".edit_button ").click(function()
используя метод live()
$(".edit_button").live("click", function()....
данные, полученные после загрузки контента страницы, в частности посредством ajax запроса не подхватываются яваскриптами... их можно активировать только используя live() или bind()
Для просмотра ссылки Войди или Зарегистрируйся
кроме того немного смущает этот кусок кода:
PHP:
      // формируем строку запроса
        var data            = 'StringID='+ StringID+'&StringINT='+StringINT+'&StringFUL='+StringFUL;
 
        // если StringID не пустая
        if(StringID) {
чего вдруг проверка на StringID если переменная - data, вот на её наличие и нужно проверять...
Data это строка с хапросом она будет всегда существовать и будет не пустая, а StringID это передаваемый параметр он может существовать а может и нет
 
Согласен...
вот еще мысль:
PHP:
 // делаем ajax запрос $.ajax({ type: "POST", url: "do_search.php", data: data, dataType: "json", success: function(data) { // запустится после получения резуотатов $("#results").show(); $("#resultID").text(data.id); $("#resultINT").text(data.introtext); $("#resultFUL").text(data.fulltext); } });
здесь можно ещё здесь заменить:
PHP:
  $("#results").show();
                    $("#resultID").text(data.id);
                    $("#resultINT").text(data.introtext);
                    $("#resultFUL").text(data.fulltext);
на
PHP:
  $("#results").show();
                    $("#resultID").val(data.id);
                    $("#resultINT").val(data.introtext);
                    $("#resultFUL").val(data.fulltext);
 
Согласен...
вот еще мысль:

здесь можно ещё здесь заменить:
PHP:
  $("#results").show();
                    $("#resultID").text(data.id);
                    $("#resultINT").text(data.introtext);
                    $("#resultFUL").text(data.fulltext);
на
PHP:
  $("#results").show();
                    $("#resultID").val(data.id);
                    $("#resultINT").val(data.introtext);
                    $("#resultFUL").val(data.fulltext);

val на text поменял уже давно не катит ни так ни так
 
Даже не знаю что и посоветовать.... ну ладно... смотрите:
при отправке измененных данных формируется переменная var data= 'StringID='+ StringID+'&StringINT='+StringINT+'&StringFUL='+StringFUL;
в ней соответственно передаются StringID, StringINT, StringFUL
при этом в файле do_search.php идет проверка: if (isset($_POST['resultID'])) {
а где он этот resultID? его то не передаете в файл...
и да... поглядел внимательно html разметку Вашего скрипта... есть пару моментов:
Код:
<p>ID<br/><textarea id="resultID" name="resultID" rows="1" cols="5" id="resultID" class="resultID"></textarea></p>
<p>Анонс<br/><textarea id="resultINT" name="resultINT" rows="8" cols="100" id="resultINT" class="resultINT"></textarea></p>
<p>Статья<br/><textarea id="resultFUL" name="resultFUL" rows="8" cols="100" id="resultFUL" class="resultFUL"></textarea></p>
Зачем в textarea id указанны по два раза? Кроме того:
Код:
<form id="editor" method="post" action="<? $PHP_SELF ?> " method=post enctype=multipart/form-data  width="50%" height="50%">
action="<? $PHP_SELF ?> " - это для чего? если указать ссылку на этот же файл, то достаточно action="" такой формы записи... И если не ошибаюсь в последних версиях PHP $PHP_SELF уже не используется.. вместо нее применяется $_SERVER['PHP_SELF']...
 
Все исправил все работает!
Но есть одно "но"

1. В строке поиска вводим фразу для поиска редактируемой статьи
2. Жмем поиск

3. Форма заполняется из трех полей
ид записи
анонс
тело статьи заполняется данными
4. Редактируем любую часть статьи или анонса
5. Жмем отправить
Статья успешно изменилась в базе!
Но если я введу новую фразу для поиска, то наши поля заполнятся новыми данными, заисключением того поля которое мы до этого редактировали, оно как и прежде будет отображать отредактированные данные, т.е. ищем разные фразы, поля заполняются кроме того в котором были сделаны изменения и отправлены в базу. Вот новый код скрипта
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>PHP, jQuery search demo</title>
<link rel="stylesheet" type="text/css" href="my.css">
 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
 
$(function() {
 
    $(".edit_button").click(function() {
        // получаем то, что написал пользователь
        var resultID    = $("#resultID").val();
        var resultINT    = $("#resultINT").val();
        var resultFUL    = $("#resultFUL").val();
        // формируем строку запроса
        var data            = 'resultID='+ resultID+'&resultINT='+resultINT+'&resultFUL='+resultFUL;
 
        // если resultID  не пустая
        if(resultID) {
            // делаем ajax запрос
            $.ajax({
                type: "POST",
                url: "do_searcha.php",
                data: data
            });
        }
        return false;
    });
});
</script>
<script type="text/javascript">
 
$(function() {
 
    $(".search_txt").click(function() {
        // получаем то, что написал пользователь
        var searchString    = $("#search_box").val();
        // формируем строку запроса
        var data            = 'search='+ searchString;
 
        // если searchString не пустая
        if(searchString) {
            // делаем ajax запрос
            $.ajax({
                type: "POST",
                url: "do_searcha.php",
                data: data,
                dataType: "json",
                beforeSend: function(html) { // запустится до вызова запроса
                    $("#resultID").empty();
                    $("#resultINT").empty();
                    $("#resultFUL").empty();
              },
                success: function(data)
                { // запустится после получения резуотатов
                    $("#results").show();             
                    $("#resultID").text(data.id);
                    $("#resultINT").text(data.introtext);
                    $("#resultFUL").text(data.fulltext);                 
              } 
            });
        }
        return false;
    });
}); 
</script> 
 
</head>
<body>
<h3 style="text-align:center;">Попробуйте ввести слово ajax</h3>
<div id="container">
<div style="margin:20px auto; text-align: center;">
<div style="margin:20px auto; text-align: center;">
<form method="post" action="do_search.php">
    <input type="text" name="search" id="search_box" class='search_box'/>
    <input type="submit" value="Поиск" class="search_txt" /><br />
</form>
</div>
<div id="searchresults">Результаты для <span class="word"></span></div>
<ul id="results" class="update">
<form method="post" action="do_search.php"> 
    <p>ID<br/>
    <textarea name="resultID" id="resultID" class="resultID" rows="1" cols="5" id="resultID"></textarea>
    </p><p>Анонс<br/>
    <textarea name="resultINT" id="resultINT" class="resultINT" rows="8" cols="100" id="resultINT"></textarea>
    </p><p>Статья<br/>
    <textarea name="resultFUL" id="resultFUL" class="resultFUL" rows="8" cols="100" id="resultFUL"></textarea>
    </p><p>
    <input type="submit" value="Изменить" class="edit_button"/></p>
</form>
</ul>
</div>
 
</div>
 
</body>
</html>

Вот обработчик на сервере
Код:
<?php
//получаем данные через $_POST
if (isset($_POST['search'])) {
    // подключаемся к базе
    include('db.php');
    $db = new db();
    // никогда не доверяйте входящим данным! Фильтруйте всё!
    $word = mysql_real_escape_string($_POST['search']);
    // Строим запрос
    $sql = "SELECT * FROM `jos_content` WHERE `fulltext` LIKE '%" . $word . "%' or `introtext` LIKE '%" . $word . "%' or 'state' LIKE '1' LIMIT 0 , 30"; 
 
    // Получаем результаты
    $row = $db->select_list($sql);
    if(count($row)==1) {
    $q = mysql_query($sql);
    $res = mysql_fetch_assoc($q);
    echo json_encode($res);
        } else {
        echo '<li>Не уникальный запрос!</li>';
    }     
}
if (isset($_POST['resultID'])) {
    // подключаемся к базе
    include('db.php');
    $db = new db();
    // никогда не доверяйте входящим данным! Фильтруйте всё!
    $resultID = mysql_real_escape_string($_POST['resultID']);
    $resultINT = mysql_real_escape_string($_POST['resultINT']);
    $resultFUL = mysql_real_escape_string($_POST['resultFUL']);
    // Строим запрос 
    $sql1 = "UPDATE `jos_content` SET `introtext` = '".$resultINT."',`fulltext` = '".$resultFUL."' WHERE `jos_content`.`id` = ".$resultID;
    // Получаем результаты 
    $q = mysql_query($sql1);
    //echo $sql.'<li>Обновили!</li><br>';
    $sql = "SELECT * FROM `jos_content` WHERE `jos_content`.`id` = ".$resultID;
    // Получаем результаты
    $row = $db->select_list($sql);
    if(count($row)==1) {
        $end_result = '';
        foreach($row as $r)
        {         
            $resultID        = $r['id'];                 
            $resultINT        = $r['introtext'];                 
            $resultFUL        = $r['fulltext'];                 
        } 
        echo "<p>ID<br/><textarea id=\"resultID\" name=\"resultID\" rows=\"1\" cols=\"5\" id=\"resultID\" class=\"resultID\">".$resultID."</textarea></p><p>Анонс<br/><textarea id=\"resultINT\" name=\"resultINT\" rows=\"8\" cols=\"100\" id=\"resultINT\" class=\"resultINT\">".$resultINT."</textarea></p><p>Статья<br/><textarea id=\"resultFUL\" name=\"resultFUL\" rows=\"8\" cols=\"100\" id=\"resultFUL\" class=\"resultFUL\">".$resultFUL."</textarea></p><p><input type=\"submit\" class=\"edit_button\"/></p>";
            } else {
        echo '<li>Не уникальный запрос!</li>';
    }     
} 
?>

Сласс для работы с базой не изменился но на всякий случай вставлю, мож кому пригодится
Код:
<?php
  class db {
 
    function __construct()
    {
        global $dbh;
        if (!is_null($dbh)) return;
        $dbh = mysql_pconnect('localhost', 'root', '');
        mysql_select_db('stroydump');
        mysql_query('SET NAMES utf8');
    }
 
    function select_list($query)
    {
        $q = mysql_query($query);
        if (!$q) return null;
        $ret = array();
        while ($row = mysql_fetch_array($q, MYSQL_ASSOC)) {
            array_push($ret, $row);
        }
        mysql_free_result($q);
        return $ret;
    } 
  }
?>

live("click", function() не помогло по прежнем поле не обновляется после редактирования

bind() так же не помог
 
попробуйте так:
Код:
    $(".search_txt").click(function() {
        // получаем то, что написал пользователь
        var searchString    = $("#search_box").val();
        // формируем строку запроса
        var data            = 'search='+ searchString;
 
        // если searchString не пустая
        if(searchString) {
            // делаем ajax запрос
            $.ajax({
                type: "POST",
                url: "do_searcha.php",
                data: data,
                dataType: "json",
                beforeSend: function(html) { // запустится до вызова запроса
                    $("#resultID").val("");
                    $("#resultINT").val("");
                    $("#resultFUL").val("");
              },
                success: function(data)
                { // запустится после получения резуотатов
                    $("#results").show();             
                    $("#resultID").val(data.id);
                    $("#resultINT").val(data.introtext);
                    $("#resultFUL").val(data.fulltext);                 
              }
уберите из <textarea> лишние id, замените <textarea name="resultID" id="resultID" class="resultID" rows="1" cols="5" id="resultID"></textarea> на обычный <input type="text" name="resultID" id="resultID" class="resultID"> (зачем для отображения нескольких цифр целое <textarea> использовать?:nezn: ) По хорошему resultID вообще в хайд загнать нужно, ведь насколько я понимаю, этот параметр как раз изменяться ни в коем случае не должен...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху