【问题标题】:Ajax form submission with php PDO and return message from server使用 php PDO 提交 Ajax 表单并从服务器返回消息
【发布时间】:2016-01-29 09:32:01
【问题描述】:

我正在使用下面的 php PDO 和 ajax 程序来提交用户对帖子的评论。 起初我这样做时,它工作正常,但现在它停止工作我做错了什么,有人可以为我解决这个问题或决定一个更好的方法来实现它吗?

问题 目前,当我提交回复时,它会发布到我的数据库,但不会从服务器返回消息。 示例:当我发布"hello" 时,我希望它会立即显示它而无需重新加载页面。

这里是 AJAX

<script>
$(document).ready(function(){
    $('#add-comment').submit(function()
    {
        var comment = $('#comment').val();
        var name = $('#anony').val();
        var rid = $('#rid').val();

        $('#response-out').html("<i class='fa fa-spinner fa-spin' style='font-size:19px;'></i>");
        $.ajax({
            type: 'POST',
            url: '/alter_reply.php', 
            data: 'comment='+comment+'&name='+name+'&rid='+rid,
        })
        .done(function(data){

            $('#response-out').html(data);

        })
        .fail(function() {

            alert( "Posting failed." );

        });
        return false;

    });
});
</script>

alter_reply.php

<?php

if($_POST){
$db_host = "localhost";
$db_user = "root";
$db_pass = "pass";
$db_name = "cods";

     try {
     $db_conn = new PDO("mysql:host={$db_host};dbname={$db_name}",$db_user,$db_pass);
     $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     $stmt = $db_conn->prepare("INSERT INTO replys(rid,mesreplys,rtime,rusername) VALUES(:rid,:mesreplys,:rtime,:rusername)");


$stmt->bindParam(':rid', $rid); 
$stmt->bindParam(':mesreplys', $comment);
$stmt->bindParam(':rtime', $timedate); 
$stmt->bindParam(':rusername', $user); 



$form = $_POST;
$rid = mysql_real_escape_string($form['rid']);
$comment = mysql_real_escape_string($form['comment']);
$timedate = date("Y-m-d H:i:s");
if(isset($_SESSION['username'])){
$user = $_SESSION['username'];
}else{
$anony_user = mysql_real_escape_string($form['name']);
$user = $anony_user;    
}


    $stmt->execute();

//I don't know how to do it again that why i echo back the submitted values
//if you can do it more better for me i will appricite
echo "<td><table>
                <tbody>
                    <tr>
                        <td class='comment-score'>
                                &nbsp;&nbsp;
                        </td>
                        <td>
                                &nbsp;
                        </td>
                    </tr>
                </tbody>
            </table>
        </td>";
     echo  "<td class='comment-text'>
            <div style='display: block;' class='comment-body'>";
                echo "<span class='comcopy'>";
                echo "$comment"; 
                echo "</span> <a href='' class='comment-user'>";
                echo "$user"; 
                echo "</a> <span class='comment-date' dir='ltr'> @<a class='comment-link' href='#'><span title='' class='relativetime-clean'>";
                echo "$timedate"; 
        echo "</span></a></span></div></td>";

    }
catch(PDOException $e)
    {
    echo "Error:" . $e->getMessage();
    }
$db_conn = null;
}
?>

这里是 HTML

<div id="response-out" class='comment'> </div>
<form id="add-comment" action="javascript:void(0);" style="font-size: 100%;">

<textarea placeholder="" name="comment" cols="68" rows="3" style="min-height:30px;" id="comment" required="true"></textarea>
<br/>
<?php 
if(!isset($_SESSION['username'])) { 
echo "<label>Enter name</label><br>";
echo "<input placeholder='Enter a name' style='width:130px;height: inherit;' required='true' id='anony' type='text' name='name'/>";
}?>
<input tabindex="0" value="Add Comment" class="btnpostq" id="donedbtn" type="submit"/>
<input type="hidden" value="<?php echo $_GET['postid'];?>" name="rid" id="rid"/>
</form>

【问题讨论】:

  • 请参阅:$rid = mysql_real_escape_string($form['rid']);$comment = mysql_real_escape_string($form['comment']);$anony_user = mysql_real_escape_string($form['name']);,您正在混合 API。
  • @RajdeepPaul 当我删除mysql_real_escape_string时也是同样的事情@
  • 您没有在 alter_reply.php 页面的任何地方开始会话。在 php 脚本的最顶部添加这一行 &lt;?php session_start(); ?&gt;
  • 我确实开始了会话,它发布得很好,但我希望它在不刷新页面的情况下回显数据

标签: php jquery ajax pdo


【解决方案1】:

首先:请检查您的 php 错误是否显示。 然后,我想你正在使用像 FireBug 这样的调试器来检查你的 javascript 和 AJAX 请求。 如果没有,请配置 php 错误并为您的浏览器安装调试器。 如果是,请确认您没有JS错误或AJAX返回的PHP错误。

我回答的目的是先清理你的代码,尽量避免出错。

Javascript:

<script>
$(document).ready(function(){
    $('#add-comment').submit(function()
    {
        var comment = $('#comment').val();        
        var rid = $('#rid').val();

        // Check if anony exist to avoid JS error
        if(0 < $('#anony').length)
        {
            var name = $('#anony').val();
            var dataToSend = 'comment='+comment+'&rid='+rid;
        }
        else
        {
            var name = '';
            var dataToSend = 'comment='+comment+'&rid='+rid;
        }

        var dataToSend = 

        $('#response-out').html("<i class='fa fa-spinner fa-spin' style='font-size:19px;'></i>");
        $.ajax({
            type: 'POST',
            url: '/alter_reply.php', 
            data: dataToSend,
        })
        .done(function(data){

            $('#response-out').html(data);

        })
        .fail(function() {

            alert( "Posting failed." );

        });
        return false;

    });
});
</script>

PHP:

if(0 < sizeof($_POST))
{
    //First retrieve your data
    $form = $_POST;
    $rid = $form['rid'];
    $comment = $form['comment'];
    $timedate = date("Y-m-d H:i:s");
    if(isset($_SESSION['username'])){
        $user = $_SESSION['username'];
    }else{
        $anony_user = $form['name'];
        $user = $anony_user;    
    }

    $db_host = "localhost";
    $db_user = "root";
    $db_pass = "pass";
    $db_name = "cods";

    try 
    {
        $db_conn = new PDO("mysql:host={$db_host};dbname={$db_name}",$db_user,$db_pass);
        $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $db_conn->prepare("INSERT INTO replys(rid,mesreplys,rtime,rusername) VALUES(:rid,:mesreplys,:rtime,:rusername)");

        //Now you have first retrieve data, you can bind
        $stmt->bindParam(':rid', $rid); 
        $stmt->bindParam(':mesreplys', $comment);
        $stmt->bindParam(':rtime', $timedate); 
        $stmt->bindParam(':rusername', $user); 
        $stmt->execute();
    }
    catch(PDOException $e)
    {
        echo "Error:" . $e->getMessage();
    }
    $db_conn = null;

    //I don't know how to do it again that why i echo back the submitted values
    //if you can do it more better for me i will appricite

    //Cleaning HTML : your tags where crossing and you were including spans in spans, not sure its usefull

    echo 
            '<table>'.
                '<tbody>'.
                    '<tr>'.
                        '<td class="comment-score">'.
                                '&nbsp;&nbsp;'.
                        '</td>'.
                        '<td>'.
                                '&nbsp;'.
                        '</td>'.
                    '</tr>'.
                    '<tr>'.
                        '<td class="comment-text">'.
                            '<div style="display: block;" class="comment-body">'.
                                '<span class="comcopy">'.$comment.'</span>'.
                                '<a href="" class="comment-user">'.$user.'</a>'.
                                '<span class="comment-date" dir="ltr">'.
                                    '@<a class="comment-link relativetime-clean" href="#">'.$timedate.'</a>'.
                                '</span>'.
                            '</div>'.
                        '</td>'.
                    '</tr>'.
                '</tbody>'.
            '</table>';


}
else
{
    echo 'no data';
}

【讨论】:

    【解决方案2】:

    我终于找到了解决问题的方法 这是我所做的并且工作正常

    $(document).ready(function(e){
        $("#add-comment").submit(function(){
                    var comment = $('#comment').val();
                    var name = $('#anony').val();
                    var rid = $('#rid').val();
        $.ajax({
        url:'/alter_reply.php',
        data:'comment='+comment+'&name='+name+'&rid='+rid,
        type: "POST",
        beforeSend: function(){
        $('#response-out').html("<i class='fa fa-spinner fa-spin' style='font-size:19px;'></i>");
        },
        success: function(data){
            $('#response-out').html(data);
        }
          });
       });
    });
    

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多