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

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

ただいまの
回答率

89.64%

PHP Ajax Error:Unexpected token Cを直したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 113

ruby.uyu

score 1

前提・実現したいこと

数日前からPHPの勉強中でAjaxを使用した削除機能を作っていて出ているエラーを理解し直したい。

発生している問題・エラーメッセージ

delete_func.phpで何故、success:functionの方にいかないのかわからない。

エラーメッセージ:削除ボタンを押した時に出る

SyntaxError: Unexpected token C in JSON at position 0

現状

delete_func.phpに変数自体は渡されている。
delete_func.phpのデータベースへのdelete文は機能し削除はできている。
resistのscript文でerror:functionの方にいってしまう。

該当のソースコード

resist.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>サンプルテンプレート</title>
    <meta name="description" content="サンプルテンプレート">
    <meta name="keywords" content="レストラン,フレンチ,原宿">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <link href="css/reset.css" rel="stylesheet" type="text/css">
    <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
</head>
<body>
  <div>
    <a href="login.php">ログイン</a>
  </div>
  <div>
    <a href="resist.php">新規追加</a>
  </div>
  <div>
    <a href="index.php">ユーザー画面へ</a>
  </div>
  <div>
    <a href="logout.php">ログアウト</a>
  </div>
<?php

    //データベースを呼び出します。
    require_once "db.php";

  if (!empty($_GET["edit"])) {

    $editId = $_GET["edit"];

    $userdataEdit = "SELECT * FROM user WHERE id = '".$editId."'ORDER BY id DESC";
    $userdataEdit = mysqli_query($mysqli,$userdataEdit);

    while($userdataEditArray = mysqli_fetch_assoc($userdataEdit)){
      $name = $userdataEditArray["name"];
      $age = $userdataEditArray["age"];
      $skill = $userdataEditArray["skill"];

            $mail = $userdataEditArray["mail"];
            $hashpass = $userdataEditArray["password"];
    }
    $userCount = $userdataEdit->num_rows;


      if($_SERVER['REQUEST_METHOD'] === 'POST'){

          $name = htmlspecialchars($_POST['name'],ENT_QUOTES);
          $skill = htmlspecialchars($_POST['skill'],ENT_QUOTES);
          $age = htmlspecialchars($_POST['age'],ENT_QUOTES);

            //メールアドレスとパスワードをキャッチします。
            $mail = htmlspecialchars($_POST['mail'], ENT_QUOTES);
            $password = htmlspecialchars($_POST['password'], ENT_QUOTES);

            function mailcheck($mail){
                //こちらの記号は正規表現と言います。
                //今回は、メールアドレスの形を表しています。
                //正規表現で$mail内に入っているデータがメールアドレスの形じゃなければfalseを返します。
                if(preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD', $mail)){
                    return 'true';
                }else{
                    return 'false';
                }
            };

            //$mailが空じゃなければバリデーションチェック呼び出します。
            //空の場合は$mailresultにfalseを返します。
            if(!empty($mail)){
                $mailresult = mailcheck($mail);
            }else{
                $mailresult = "false";
            };

            //パスワードの暗号化と空欄チェック
            if(!empty($password)){
                $hashpass = password_hash($password,PASSWORD_BCRYPT);
            };

            if(empty($hashpass)){
                $passresult = "false";
            }else{
                $passresult = "true";
            };

            if($mailresult!=="false" && $passresult!=="false"){
                $result = mysqli_query($mysqli,"UPDATE user SET name = '".$name."',skill = '".$skill."',age = '".$age."',mail = '".$mail."',password = '".$hashpass."' WHERE id = '".$editId."'");
                echo "アップデート完了";
            };
      };

  }else{
    $userCount = 0;

    if($_SERVER['REQUEST_METHOD'] === 'POST'){

          $name = htmlspecialchars($_POST['name'],ENT_QUOTES);
          $skill = htmlspecialchars($_POST['skill'],ENT_QUOTES);
          $age = htmlspecialchars($_POST['age'],ENT_QUOTES);

            //メールアドレスとパスワードをキャッチします。
            $mail = htmlspecialchars($_POST['mail'], ENT_QUOTES);
            $password = htmlspecialchars($_POST['password'], ENT_QUOTES);

            function mailcheck($mail){
                //こちらの記号は正規表現と言います。
                //今回は、メールアドレスの形を表しています。
                //正規表現で$mail内に入っているデータがメールアドレスの形じゃなければfalseを返します。
                if(preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD', $mail)){
                    return 'true';
                }else{
                    return 'false';
                }
            };

            //$mailが空じゃなければバリデーションチェック呼び出します。
            //空の場合は$mailresultにfalseを返します。
            if(!empty($mail)){
                $mailresult = mailcheck($mail);
            }else{
                $mailresult = "false";
            };

            //パスワードの暗号化と空欄チェック
            if(!empty($password)){
                $hashpass = password_hash($password,PASSWORD_BCRYPT);
            };

            if(empty($hashpass)){
                $passresult = "false";
            }else{
                $passresult = "true";
            };


            if($mailresult!=="false" && $passresult!=="false"){
                $result = mysqli_query($mysqli,"INSERT INTO user(name,skill,age,mail,password) VALUES('$name','$skill','$age','$mail','$hashpass')");
                echo '新規登録完了';
            };
      };
  };

?>
<form action="" method="post">
    <input type="text" name="mail" placeholder="メールアドレス" value="<?php if(!empty($mail)){echo $mail;};?>"><br>
    <?php if(!empty($mailresult)){if($mailresult == "false"){echo "メールアドレスにエラーがあります。<br>";};};?>
    <input type="password" name="password" placeholder="パスワード" value=""><br>
    <?php if(!empty($passresult)){if($passresult == "false"){echo "パスワードにエラーがあります。<br>";};};?>
  <input type="text" name="name" placeholder="お名前" value="<?php if (!empty($name)){echo $name;}; ?>"/><br/>
  <input type="text" name="age" placeholder="年齢" value="<?php if (!empty($age)){echo $age;}; ?>"/><br/>
  <input type="text" name="skill" placeholder="スキル" value="<?php if (!empty($skill)){echo $skill;}; ?>"/><br/>
    <?php if($userCount == 0): ?>
      <input type="submit" name="submitBtn" value="登録">
    <?php else: ?>
        <input type="submit" name="submitBtn" value="更新">
    <?php endif; ?>
</form>

<?php

  $userdata = "SELECT * FROM user ORDER BY id DESC";
  $userdata = mysqli_query($mysqli,$userdata);

  while ($userdataArray = mysqli_fetch_assoc($userdata)) {
      echo $id = $userdataArray["id"];
      echo ",";
        echo $name = $userdataArray["name"];
        echo ",";
        echo $age = $userdataArray["age"];
        echo ",";
        echo $skill = $userdataArray["skill"];
        echo "|";
        echo "<button class='deleteBtn' data-id='".$id."'>削除する</button>";
        echo "|";
        //編集ボタンを追加。editBtnを押した時にjsでURLにパラメータを付与。
        echo "<button class='editBtn' data-id='".$id."'>編集する</button>";
        echo "<br>";
    };

?>


<script>

    $(".deleteBtn").click(function(){
        var btnid = $(this).data("id");
        deleteData(btnid);
    });

    //編集ボタンをeditBtnをクリックすると、、
    $(".editBtn").click(function(){
        //ボタンにセットされたdata-idを取得。
        var btnid = $(this).data("id");
        //URLにパラメータ./?edit={id}をつけて再読み込み。
        window.location.href = "./resist.php?edit="+btnid;
        //次の画面でURLパラメータをphpが受け取り、処理。
        //冒頭から読み返してみてください。
    });
  function deleteData(btnid){
    $.ajax({
      type:'POST',
      dataType:'json',
      url:'delete_func.php',
      data:{
        btnid:btnid,
      }
    }).then(
      function(data){
        window.location.href = "./";
      },
      function(XMLHttpRequest,textStatus,errorThrown){
        alert(errorThrown);
      }
    )
  };

</script>

</body>
</html>

delete_func.php

<?php
    //データベースを呼び出します。
    require_once "db.php";

    //jsから受け取ったデータのidを取得します。
    $jsondata = $_POST['btnid'];

    //MySqlで該当データを削除します。
    //データベース内でidが一致したデータを削除します。
    $resultcontents = mysqli_query($mysqli,"delete from user where id = '".$jsondata."'");

    //完了したら、結果をjsに返します。
    //今回はid($jsondata)をそのまま返していますが、特に深い意味はないです。
    header('Content-type: application/json');
    echo json_encode( $jsondata );
?>

db.php

<?php
  $mysqli = new mysqli("localhost", "root", "admin", "userData");

    //もしエラーが起きたら、エラー内容が表示されます。
    if ($mysqli->connect_errno) {
        printf("接続失敗: %s\n", $mysqli->connect_error);
        exit();
    }

  if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
    exit();
  } else {
    printf("Current character set: %s\n", $mysqli->character_set_name());
  }
 ?>

試したこと

https://teratail.com/questions/184047
上記などで似たようなエラーを見つけて試してみましたがerrorが"token C"ではないfixの記事が多く解決できませんでした

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

db.phpでprintfするのをやめましょう。

【PHP: header - Manual】
https://www.php.net/manual/ja/function.header.php

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/15 23:38

    早速の回答ありがとうございます。
    解決しました。

    教材をコピペせずその都度、正しいか確認して勉強を進めたいと思います。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる