yudai39
@yudai39 (Yudai Otahara)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

phpとSQLで変数がごちゃ混ぜに

Q&A

Closed

解決したいこと

PHPとSQLで簡易掲示板をつくっています。
新規投稿、編集機能、そして削除機能をつけています。
が、timeという変数に対してエラーがおきます。定義しているのに、「Undefined index」と表示されてしまいます。また同様に"password"も定義されていないみたいです。
解決方法を教えていただきたいです。

発生している問題・エラー

Notice: Undefined index: time in --.php on line 167
Notice: Undefined index: password in --.php on line 83
Notice: Undefined index: password in --.php on line 104

例)

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>掲示板</title>
</head>
<body>
    
<?php

//フィールド変数
$time = date("Y年m月d日 H時i分s秒");
$reName="";
$reTxt="";
$selectEdit="";
?>


<?php
//データベースに接続
$dsn='';
$user = '';
$password = '';
$pdo = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

//テーブル作成
    $sql = "CREATE TABLE IF NOT EXISTS tb"
    ." ("
    . "id INT AUTO_INCREMENT PRIMARY KEY,"
    . "name char(32),"
    . "comment TEXT,"
    . "time DATETIME,"
    . "password TEXT"
    .");";
    $stmt = $pdo->query($sql);
?>

<?php
//新規or編集
if (!empty($_POST["name"]) &&!empty($_POST["txt"]) && !empty($_POST["pass"]) && !empty($_POST["submit"])){

    $name=$_POST["name"];
    $comment=$_POST["txt"];
    $pass=$_POST["pass"];

   //編集投稿
   $updateNum=$_POST["updateNum"];
    if($updateNum>0){
        $sql= "UPDATE tb SET name=:name, comment=:comment, time=:time, password=:password WHERE id=:id";
        $update= $pdo->prepare($sql);
        $update->bindParam(":name", $name, PDO::PARAM_STR);
        $update->bindParam(":comment", $comment, PDO::PARAM_STR);
        $update->bindParam(":time", $time, PDO::PARAM_STR);
        $update->bindParam(":password", $pass, PDO::PARAM_STR);
        $update->bindParam(":id", $updateNum, PDO::PARAM_INT);
        $update->execute();
    }else{ //新規投稿
    
        $post=$pdo->prepare("INSERT INTO tb(name, comment, time, password) VALUES(:name, :comment, :time, :password)");
        $post->bindParam(":name", $name, PDO::PARAM_STR);
        $post->bindParam(":comment", $comment, PDO::PARAM_STR);
        $post->bindParam(":time", $time, PDO::PARAM_STR);
        $post->bindParam(":password", $pass, PDO::PARAM_STR);
        $post->execute();
    }


}


// 削除処理
if (!empty($_POST["delnum"]) && !empty($_POST["delpass"]) && !empty($_POST["delete"])) {

    $delpass=$_POST["delpass"];
    $delnum = $_POST["num"];
    $sql="SELECT * FROM tb WHERE id=:id";
    $delete=$pdo->prepare($sql);         //削除するとこゲットしてSQL実行の準備
    $delete->bindParam(":id", $delnum, PDO::PARAM_INT);
    $delete->execute();
    //結果セットの全てをゲットして
    $lines=$delete->fetchALL();
    foreach($lines as $line){
        if($delpass==$line["password"]){ //番号同じなら削除
                $sql = 'delete from tb where id=:id';
                $stmt = $pdo->prepare($sql);
                $stmt->bindParam(':id', $delnum, PDO::PARAM_INT);
                $stmt->execute();
      }
    }}


//編集投稿
if (!empty($_POST["editnum"]) && !empty($_POST["editpass"]) && !empty($_POST["edit"])) {
    $editpass=$_POST["editpass"];
    $editnum=$_POST["editnum"];
    
    $sql="SELECT * FROM tb WHERE id=:id";
    $edit=$pdo->prepare($sql);
    $edit->bindParam(":id", $editnum, PDO::PARAM_INT);
    $edit->execute();
    
    $lines=$edit->fetchAll();
    foreach($lines as $line){
        if($line["password"]==$_POST["editpass"]){//パスワード一致なら表示
            $newname=$line["name"];
            $newcomment=$line["comment"];
            $newnum=$line["id"];
        }
    }

}

?>



<form action="" method="post">
    <!-- 投稿用 -->
    <h3>【投稿フォーム】</h3>
    <br>
    <label>名前:</label>
    <input type="text" name="name" value="<?php echo $reName; ?>" placeholder="名前">
    <br>
    <label>コメント:</label>
    <input type="text" name="txt" value="<?php echo $reTxt ; ?>" placeholder="コメント">
    <input type="hidden" name="updateNum" value="<?php echo $selectEdit; ?>">
    <br>
    <label>パスワード:</label>
    <input type="password" name="pass" placeholder="パスワードを入力してください">
    <br>
    <input type="submit" name="submit" value="送信">
    <br>

    <!-- 削除用 -->
    <h3>【削除フォーム】</h3>
    <br>
    <label>投稿番号:</label>
    <input type="number" name="delnum" value="">
    <br>
    <label>パスワード:</label>
    <input type="password" name="delpass" placeholder="パスワードを入力してください">
    <br>
    <input type="submit" name="delete" value="削除">
    
    <!-- 編集用 -->
    <h3>【編集フォーム】</h3>
    <br>
    <label>投稿番号:</label>
    <input type="number" name="editnum" value="" placeholder="編集したい投稿番号">
    <br>
    <label>パスワード:</label>
    <input type="password" name="editpass" placeholder="パスワードを入力してください">
    <br>
    <input type="submit" name="edit" value="編集">
    <br>
    <input type="hidden" name="hiddenNum" value="<?php echo $selectEdit; ?>" >
</form>
<?php
//ブラウザに表示
$sql="SELECT * FROM tb";
$statement=$pdo->query($sql);
$lines=$statement->fetchAll();
foreach($lines as $line){
        echo $line["id"]. "<br>";
        echo "名前: " . $line["name"] . "<br>";
        echo "コメント: " . $line["comment"] . "<br>";
        echo $line["time"] . "<br><br>";
    }
?>


出力時の画面

スクリーンショット 2023-06-05 14.56.37.png

0

1Answer

実際の DB を見ないと分からないので勘ですが、存在しないと言われているカラム timepassword はテーブル定義の最後の2カラムですね。もしかして元々のテーブル定義は

    $sql = "CREATE TABLE IF NOT EXISTS tb"
    ." ("
    . "id INT AUTO_INCREMENT PRIMARY KEY,"
    . "name char(32),"
    . "comment TEXT"
    .");";

になっていて、一度実行した後で timepassword の行を追加したのでは?その場合、すでに存在するテーブルに対してはこれらのカラムが追加されることはありません。

カラムを追加するには別途 ALTER TABLE を発行してテーブルを変更してください。

3Like

Comments

  1. @yudai39

    Questioner

    ありがとうございます!!え、当たってました。。!!
    一度DROP文で消して、もう一度実行してみたら、そのエラーが消えました。一方で

    Warning: PDOStatement::execute(): SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2023年06月06日 11時19分59秒' for column 'time' at row 1 in /public_html/mission_5-1.php on line 64
    というエラーが起きましたが、dateの()内が正しい形になってなかったみたいです。平常に動きました!ありがとうございます

Your answer might help someone💌