質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

1370閲覧

php とajaxで2度目の自動更新で失敗する

keisei-001

総合スコア15

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/12/28 08:25

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-&gt;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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Ajaxのtype全部POSTになってますが、URLでもなんでもGETで送信してますか?
提示されたコードからは分からないです。

投稿2019/12/28 09:30

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keisei-001

2019/12/28 09:39

コメントありがとうございます。 知識不足で申し訳ないのですが、getかpostで送るかという指定をコードで書いているのはajaxのオプションのところでしか書いていません。 ですので基本はgetになると思っていますが認識として違いますでしょうか?
m.ts10806

2019/12/28 10:00

type: "POST", で送信したらREQUEST METHODはPOSTです。
keisei-001

2019/12/28 14:27

申し訳ありません。外出先でコメントをしている際に謝って解決済みとしてしまいました。 現状はまだ解決していない状況です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問