phpとjqueryを使ってチャットアプリを作成しているのですがチャットを投稿し1度目の投稿の後に別の画面で開いたブラウザでajaxをsetIntervalで発動させて更新したところまではできたのですが、次のsetintervalのタイミングでエラーとなります。なお、投稿をした画面の方ではエラーは発生しません。
下記がエラーの内容です。
Uncaught TypeError: Cannot use 'in' operator to search for 'length' in <br /> <b>Fatal error</b>: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 in /Applications/MAMP/htdocs/honban/chat/_auto_ajax.php:5 Stack trace: #0 /Applications/MAMP/htdocs/honban/chat/_auto_ajax.php(5): PDO->query('select * FROM c...') #1 {main} thrown in <b>/Applications/MAMP/htdocs/honban/chat/_auto_ajax.php</b> on line <b>5</b><br />
エラーの内容を見ると
・IN演算子を使うなと言われている
・''の空文字?が使われている。
というような理由かと思っていますが具体的な解決策がわからずに詰まっております。
ajaxが発動した後か前に処理を止めるようなことを書いたら良いのかなと漠然と考えておりますがいかがでしょうか?
お手数をおかけしますがご教授のほどよろしくお願いいたします。
該当のソースコード
index.php
php
1<?php 2require_once(__DIR__ . '/config.php'); 3$stmt = $dbh->query("select * from chat order by id desc limit 6;"); 4$chats = $stmt->fetchAll(\PDO::FETCH_OBJ); 5?> 6 7<!DOCTYPE html> 8<html lang="ja"> 9<head> 10 <meta charset="UTF-8"> 11 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 12 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 13 <title>????</title> 14</head> 15<body> 16 <form action="/_post_ajax.php" method="post" id="form" enctype="multipart/form-data"> 17 <p> 18 <input type="text" name="title"> 19 </p> 20 <p> 21 <textarea name="content"></textarea> 22 </p> 23 <input class="submit" id="submit" type="submit" name="send"> 24 </form> 25 <div class="entry-box"> 26 <?php foreach ($chats as $chat) :?> 27 <div class="entry" data-id="<?php echo h($chat->id) ?>"> 28 <p><span>title:</span><?php echo h($chat->title) ?></p> 29 <p><span>content:</span><?php echo h($chat->content) ?></p> 30 </div> 31 <?php endforeach;?> 32 </div> 33 <script src="//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 34 <script src="/js/script.js"></script> 35 </body> 36</html>
_post_ajax.php
php
1<?php 2 require_once(__DIR__ . '/config.php'); 3 $last_entry_id = $_GET['last_entry_id']; 4 $sql = "select * FROM chat WHERE id > $last_entry_id"; 5 $stmt = $dbh->query($sql); 6 $add_entries = $stmt->fetchAll(); 7 //受け取ったデータを配列に格納 8 $return_array = $add_entries; 9 //ヘッダーの設定 10 header('Content-type:application/json; charset=utf8'); 11 // 「$return_array」をjson_encodeして出力 12 echo json_encode($return_array); 13?> 14
_auto_ajax.php
php
1<?php 2 require_once(__DIR__ . '/config.php'); 3 $last_entry_id = $_GET['last_entry_id']; 4 $sql = "select * FROM chat WHERE id > $last_entry_id"; 5 $stmt = $dbh->query($sql); 6 $add_entries = $stmt->fetchAll(); 7 //受け取ったデータを配列に格納 8 $return_array = $add_entries; 9 //ヘッダーの設定 10 header('Content-type:application/json; charset=utf8'); 11 // 「$return_array」をjson_encodeして出力 12 echo json_encode($return_array); 13?>
Javascript
1$(function () { 2 3 $('#form').on('submit', function (e) { 4 e.preventDefault(); 5 var params_title = $('#form [name=title]').val(); 6 var params_content = $('#form [name=content]').val(); 7 var url = $(this).attr('action') 8 $.ajax({ 9 url: url, 10 type: "POST", 11 dataType: 'json', 12 data: { title: params_title, content: params_content } 13 }) 14 .done(function (data, textStatus, xhr) { 15 $(".entry-box").prepend( 16 '<div class="entry" data-id="' + data[0].id + '">' 17 + '<p><span>title:</span>' + data[1] + '</p>' 18 + '<p><span>content:</span>' + data[2] + '</p>' 19 + '</div>' 20 ); 21 }) 22 .fail(function (XMLHttpRequest, textStatus, errorThrown) { 23 console.log("ajax失敗"); 24 }); 25 }); 26 27 28 setInterval(update, 12000); 29 30 function update() { 31 if ($(".entry").length ) { 32 var last_entry_id = $(".entry").first().attr("data-id"); 33 console.log(last_entry_id); 34 } else { 35 return false; 36 } 37 $.ajax({ 38 url: "/_auto_ajax.php", 39 type: 'post', 40 data: { last_entry_id: last_entry_id } 41 }) 42 .done(function (data, textStatus, xhr) { 43 if (data.length !== 0 ) { 44 console.log(data + "の投稿はあるよ!"); 45 $.each(data, function (i, data) { 46 $(".entry-box").prepend( 47 '<div class="entry" data-id=' + data.id + '">' 48 + '<p><span>title:</span>' + data.title + '</p>' 49 + '<p><span>content:</span>' + data.content + '</p>' 50 + '</div>' 51 ); 52 }); 53 } else { 54 console.log(data + "の投稿はないよ!"); 55 return false; 56 } 57 }) 58 .fail(function (XMLHttpRequest, textStatus, errorThrown) { 59 console.log("失敗!"); 60 }); 61 } 62});
補足情報(FW/ツールのバージョンなど)
PHP 7.1.23
mac os 10.14.6
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/28 09:39
2019/12/28 10:00
2019/12/28 10:52
2019/12/28 14:27