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

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

ただいまの
回答率

87.48%

就労移行のタイムカードの出勤ページで削除と追加がうまく動作しない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,866

score 62

前提・実現したいこと

ここに質問したいことを詳細に書いてください
就労移行施設のタイムカードを作成してますが,
どうしても、出勤押した後に内容が反映されないのと
対象列の削除がうまく出来ません

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

Notice: Undefined variable: rows in C:\xampp\htdocs\roumu\Attendance.php on line 224

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\roumu\Attendance.php on line 224

該当のソースコード

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

$dsn = 'mysql:dbname=mfdb;host=localhost';
$user = 'root';
$password = '';
//日本語の曜日配列
$weekjp = array(
  '日', //0
  '月', //1
  '火', //2
  '水', //3
  '木', //4
  '金', //5
  '土'  //6
);

//現在の曜日番号(日:0  月:1  火:2  水:3  木:4  金:5  土:6)を取得
$weekno = date('w');


try {

if (filter_input_array(INPUT_POST)) {
$id = filter_input(INPUT_POST, 'id');//利用者ID
$first_name = filter_input(INPUT_POST, 'first_name');//利用者名
$startyear = filter_input(INPUT_POST, 'startyear');//今年度の開始年
$startmonth = filter_input(INPUT_POST, 'startmonth');//今年度の開始月
$startday = filter_input(INPUT_POST, 'startday');//今年度の開始日
$startweek = filter_input(INPUT_POST, 'startweek');//今年度の開始曜日
$startsituation = filter_input(INPUT_POST, 'startsituation');//勤怠内容
$field2 = filter_input(INPUT_POST, 'field2');//出勤時間

$err = array();//エラー内容

if (empty($id)) {
$err['id'] = "会員番号を入力してください";
}
if (empty($first_name)) {
$err['first_name'] = "名前を入力してください";
}
if (empty($startyear)) {
$err['startyear'] = "今年度の開始年を入力してください";
}
if (empty($startmonth)) {
$err['startmonth'] = "今年度の開始月を入力してください";
}
if (empty($startday)) {
$err['startday'] = "今年度の開始日を入力してください";
}
if (empty($startweek)) {
$err['startweek'] = "今年度の開始曜日を入力してください";
}
if (empty($startsituation)) {
$err['startsituation'] = "今年度の開始曜日を入力してください";
}
if (empty($field2)) {
$err['field2'] = "勤務開始する現在時間を入力してください";
}


// エラーの数を数えて、エラーがなければインサート
if (0 == count($err)) {
//DB連携とDB接続できなくばエラー
$db = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

if (isset($_POST["delete"])) {
    $did = $_POST["delete"];
    $qry = "DELETE FROM attendanse WHERE attendanceid =:did";
    $stmt = $db->prepare($qry);
    $stmt->execute();
}else if (isset($_POST["insert"])) {
    $did = $_POST["insert"];
    //attendanse(出勤用テーブル)を追加
    $sql = "INSERT INTO attendanse (";
    $sql .= "id, first_name, startyear, startmonth, startday, startweek,startsituation,field2 ";
    $sql .= ") VALUES (";
    $sql .= ":id,:first_name,:startyear,:startmonth,:startday,:startweek,:startsituation,:field2";
    $sql .= ")";
    $stmt = $db->prepare($sql);

    // パラメータのセットの仕方はマニュアルで確認してください。
    $stmt->bindParam(':id', $id, PDO::PARAM_STR);
    $stmt->bindParam(':first_name', $first_name, PDO::PARAM_INT);
    $stmt->bindParam(':startyear', $startyear, PDO::PARAM_STR);
    $stmt->bindParam(':startmonth', $startmonth, PDO::PARAM_STR);
    $stmt->bindParam(':startday', $startday, PDO::PARAM_STR);
    $stmt->bindParam(':startweek', $startweek, PDO::PARAM_STR);
    $stmt->bindParam(':startsituation', $startsituation, PDO::PARAM_STR);
    $stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
    // 実行
    $stmt->execute();
}

$qry = "SELECT * FROM attendanse";
$data = $db->query($qry);
$data->execute();
$rows = $data->fetchAll(PDO::FETCH_ASSOC);
//$registered = mysqli_affected_rows($db);
echo "<P>下記表の内容で登録しました</P>";
}
}else {
    echo "<P>出勤時に必ず行って下さい</P>";
}
} catch (PDOException $e) {
$err['all'] = $e->getMessage();
}
?>

<?php if (isset($err) && 0 < count($err)) : ?>
<p><?= nl2br(implode(PHP_EOL, $err)); ?></p>
<?php endif; ?>
<div class="example">
  <form name="form1"action="Attendance.php" method="post">
<table>
<caption>勤怠登録手続き</caption>
<tr>
    <th rowspan="2">会員番号</th>
    <th rowspan="2">名前</th>
    <th colspan="4">日付</th>
    <th rowspan="2">時間</th>
    <th rowspan="2">出勤状況</th>
    <th rowspan="2">登録内容</th>
</tr>
<tr>
    <th>年</th>
    <th>月</th>
    <th>日</th>
    <th>曜日</th>
</tr>
<tr>
<td><input type="text" name="id" size=" 10" maxlength="50" placeholder="○○太郎"
        value="<?php if (isset($_POST['id'])) {echo htmlspecialchars($_POST['id'],ENT_QUOTES,"UTF-8");} ?>"></td>
<td><input type="text" name="first_name" size=" 10" maxlength="50" placeholder="○○太郎"
        value="<?php if (isset($_POST['first_name'])) {echo htmlspecialchars($_POST['first_name'],ENT_QUOTES,"UTF-8");} ?>"></td>
<td><input type="text" name="startyear"  size="1"value="<?php echo date("Y"); ?>" /></td>
<td><input type="text" name="startmonth"  size="1"value="<?php echo date("m"); ?>" /></td>
<td><input type="text" name="startday"   size="1"value="<?php echo date("d"); ?>" /></td>
<td><input type="text" name="startweek"  size="1"value="<?php echo $weekjp[$weekno]; ?>"></td>
<td><input type="text" name="field2" size="9"></td>
<td><select name="startsituation">
        <option value="出 勤">出勤</option>
        <option value="遅 刻">遅刻</option>
        <option value="欠 席">欠席</option>
        <option value="忌引き">忌引き</option>
  </select>
</td>
<td><input type="submit" value="出勤(in)" name="insert"></td>
</tr>
</table>
</div>
<hr><!-- //登録票と登録結果の区切り線?-->

<form action="Attendance.php" method="post">

<?php
//exitwork.php(退勤登録)の結果
//エラー設定
ini_set('display_errors', 'On');
error_reporting(E_ALL);
//DB接続設定

try {


    echo "<div class='dbs'>
      <table border>
            <caption>出勤登録結果</caption>
            <tbody>
      <tr>
        <th>編集</th>
        <th>削除</th>
                <th>出勤番号</th>
                <th>会員番号</th>
                <th>名前</th>
                <th>出勤状況</th>
                <th>日付</th>
                <th>時間</th>
      </tr>
      <tr>";

      foreach ($rows as $row) {
      echo "<td><a href='Attendancelist.php?attendanceid =".$row['attendanceid']."&=id".$row['id']."&first_name=".$row['first_name'].
      "&startyear=".$row['startyear']."&startmonth=".$row['startmonth']."&startday=".$row['startday']."&startweek=".$row['startweek'].
      "&startsituation=".$row['startsituation']."&field2=".$row['field2']."'>編集</a></td>";
      echo "<td><input type=\"radio\" name=\"delid\" value=\"{attendanceid}\"></td>";
      echo "<td> ".$row['attendanceid']."</td>
        <td> ".$row['id']."</td>
    <td> ".$row['first_name']."</td>
    <td> ".$row['startsituation']."</td>
        <td> ".$row['startyear']."年".$row['startmonth']."月".$row['startday']."日(".$row['startweek'].")"."</td>
    <td> ".$row['field2']."</td>
    <tr>
    </tr>";

  }
  echo "
   </tbody>
    </table>
  </div>";
  $db = null;
} catch (Exception $e) {
  echo $e->getMessage();
}

 ?><br>

<input type="submit" name="delete" value="削除">
</form>

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/10/05 12:16

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • kei344

    2016/10/05 16:12

    まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況をお教えください

    キャンセル

回答 1

checkベストアンサー

+2

削除できないのは、$stmt->bindParam()してないからだと思います

「Notice: Undefined variable: rows」が出ているのは、
try-catchでブロックが別れているからだと思います。
現状の処理だとtry-catchで囲んでも意味ないので、消したほうがいいと思います。

それでもうまくいかない場合は、attendanseテーブルのcreate文がわかれば、自分の環境で動かしてみますよー

show create table mfdb.attendanse;

追記 ちょっと雑ですが、動くようにしてみました。

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$dsn = 'mysql:dbname=mfdb;host=localhost';
$user = '';
$password = '';
$db = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

//日本語の曜日配列
$weekjp = array('日', //0
'月', //1
'火', //2
'水', //3
'木', //4
'金', //5
'土'  //6
);

//現在の曜日番号(日:0  月:1  火:2  水:3  木:4  金:5  土:6)を取得
$weekno = date('w');

if (filter_input_array(INPUT_POST)) {
    //DB連携とDB接続できなくばエラー

    if (isset($_POST["delete"])) {
        $did = $_POST["delid"];
        $qry = "DELETE FROM attendanse WHERE attendanceid =:did";
        $stmt = $db->prepare($qry);
        $stmt->bindParam(':did', $did, PDO::PARAM_STR);
        $stmt->execute();
    } else if (isset($_POST["insert"])) {
        $id = filter_input(INPUT_POST, 'id'); //利用者ID
        $first_name = filter_input(INPUT_POST, 'first_name'); //利用者名
        $startyear = filter_input(INPUT_POST, 'startyear'); //今年度の開始年
        $startmonth = filter_input(INPUT_POST, 'startmonth'); //今年度の開始月
        $startday = filter_input(INPUT_POST, 'startday'); //今年度の開始日
        $startweek = filter_input(INPUT_POST, 'startweek'); //今年度の開始曜日
        $startsituation = filter_input(INPUT_POST, 'startsituation'); //勤怠内容
        $field2 = filter_input(INPUT_POST, 'field2'); //出勤時間
        $err = array(); //エラー内容
        if (empty($id)) {
            $err['id'] = "会員番号を入力してください";
        }
        if (empty($first_name)) {
            $err['first_name'] = "名前を入力してください";
        }
        if (empty($startyear)) {
            $err['startyear'] = "今年度の開始年を入力してください";
        }
        if (empty($startmonth)) {
            $err['startmonth'] = "今年度の開始月を入力してください";
        }
        if (empty($startday)) {
            $err['startday'] = "今年度の開始日を入力してください";
        }
        if (empty($startweek)) {
            $err['startweek'] = "今年度の開始曜日を入力してください";
        }
        if (empty($startsituation)) {
            $err['startsituation'] = "今年度の開始曜日を入力してください";
        }
        if (empty($field2)) {
            $err['field2'] = "勤務開始する現在時間を入力してください";
        }
        // エラーの数を数えて、エラーがなければインサート
        if (0 == count($err)) {
            $did = $_POST["insert"];
            //attendanse(出勤用テーブル)を追加
            $sql = "INSERT INTO attendanse (";
            $sql.= "id, first_name, startyear, startmonth, startday, startweek,startsituation,field2 ";
            $sql.= ") VALUES (";
            $sql.= ":id,:first_name,:startyear,:startmonth,:startday,:startweek,:startsituation,:field2";
            $sql.= ")";
            $stmt = $db->prepare($sql);
            // パラメータのセットの仕方はマニュアルで確認してください。
            $stmt->bindParam(':id', $id, PDO::PARAM_STR);
            $stmt->bindParam(':first_name', $first_name, PDO::PARAM_INT);
            $stmt->bindParam(':startyear', $startyear, PDO::PARAM_STR);
            $stmt->bindParam(':startmonth', $startmonth, PDO::PARAM_STR);
            $stmt->bindParam(':startday', $startday, PDO::PARAM_STR);
            $stmt->bindParam(':startweek', $startweek, PDO::PARAM_STR);
            $stmt->bindParam(':startsituation', $startsituation, PDO::PARAM_STR);
            $stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
            // 実行
            $stmt->execute();
            echo "<P>下記表の内容で登録しました</P>";
        }
    }
} else {
    echo "<P>出勤時に必ず行って下さい</P>";
}

$qry = "SELECT * FROM attendanse";
$data = $db->query($qry);
$data->execute();
$rows = $data->fetchAll(PDO::FETCH_ASSOC);

?>

<?php if (isset($err) && 0 < count($err)): ?>
<p><?=nl2br(implode(PHP_EOL, $err)); ?></p>
<?php
endif; ?>
<div class="example">
  <form name="form1"action="Attendance.php" method="post">
<table>
<caption>勤怠登録手続き</caption>
<tr>
    <th rowspan="2">会員番号</th>
    <th rowspan="2">名前</th>
    <th colspan="4">日付</th>
    <th rowspan="2">時間</th>
    <th rowspan="2">出勤状況</th>
    <th rowspan="2">登録内容</th>
</tr>
<tr>
    <th>年</th>
    <th>月</th>
    <th>日</th>
    <th>曜日</th>
</tr>
<tr>
<td><input type="text" name="id" size=" 10" maxlength="50" placeholder="○○太郎"
        value="<?php if (isset($_POST['id'])) {
    echo htmlspecialchars($_POST['id'], ENT_QUOTES, "UTF-8");
} ?>"></td>
<td><input type="text" name="first_name" size=" 10" maxlength="50" placeholder="○○太郎"
        value="<?php if (isset($_POST['first_name'])) {
    echo htmlspecialchars($_POST['first_name'], ENT_QUOTES, "UTF-8");
} ?>"></td>
<td><input type="text" name="startyear"  size="4"value="<?php echo date("Y"); ?>" /></td>
<td><input type="text" name="startmonth"  size="2"value="<?php echo date("m"); ?>" /></td>
<td><input type="text" name="startday"   size="2"value="<?php echo date("d"); ?>" /></td>
<td><input type="text" name="startweek"  size="2"value="<?php echo $weekjp[$weekno]; ?>"></td>
<td><input type="text" name="field2" size="9"></td>
<td><select name="startsituation">
        <option value="出 勤">出勤</option>
        <option value="遅 刻">遅刻</option>
        <option value="欠 席">欠席</option>
        <option value="忌引き">忌引き</option>
  </select>
</td>
<td><input type="submit" value="出勤(in)" name="insert"></td>
</tr>
</table>
</div>
<hr><!-- //登録票と登録結果の区切り線?-->

<form action="Attendance.php" method="post">
<div class='dbs'>
<table border>
    <caption>出勤登録結果</caption>
    <tbody>
    <tr>
    <th>編集</th>
    <th>削除</th>
            <th>出勤番号</th>
            <th>会員番号</th>
            <th>名前</th>
            <th>出勤状況</th>
            <th>日付</th>
            <th>時間</th>
     </tr>
<?php
foreach ($rows as $row) {
    echo "<tr>";
    echo "<td><a href='Attendancelist.php?attendanceid =" . $row['attendanceid'] . "&=id" . $row['id'] . "&first_name=" . $row['first_name'] . "&startyear=" . $row['startyear'] . "&startmonth=" . $row['startmonth'] . "&startday=" . $row['startday'] . "&startweek=" . $row['startweek'] . "&startsituation=" . $row['startsituation'] . "&field2=" . $row['field2'] . "'>編集</a></td>";
    echo "<td><input type=\"radio\" name=\"delid\" value=\"{$row['attendanceid']}\"></td>";
    echo "<td> " . $row['attendanceid'] . "</td>
    <td> " . $row['id'] . "</td>
<td> " . $row['first_name'] . "</td>
<td> " . $row['startsituation'] . "</td>
    <td> " . $row['startyear'] . "年" . $row['startmonth'] . "月" . $row['startday'] . "日(" . $row['startweek'] . ")" . "</td>
<td> " . $row['field2'] . "</td>
<tr>
</tr>";
}
echo "
</tbody>
</table>
</div>";
$db = null;
?>

<input type="submit" name="delete" value="削除">
</form>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/05 14:38

    大変ご迷惑をおかけいたしました。
    ありがとうございます。

    キャンセル

  • 2016/10/05 16:10

    いいえー、がんばってください!

    キャンセル

  • 2016/10/05 16:36

    パソコンと携帯が台風の影響か電波が届きにくくこの質問を締めくくるの忘れました。
    すいませんでした。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る