電子書籍の厳選無料作品が豊富!

検索フォームを作ろうとしている初心者です。

<?php
foreach($rows as $row){   ←この行でエラーが発生しました。
?>

<tr>
<td><?=htmlspecialchars($row['Manufacturer'],ENT_QUOTES,'UTF-8')?></td>
<td><?=htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8')?></td>
<td><?=htmlspecialchars($row['Model year'],ENT_QUOTES,'UTF-8')?></td>
<td><?=htmlspecialchars($row['Model'],ENT_QUOTES,'UTF-8')?></td>
<td bgcolor = "ffff00"><?=htmlspecialchars($row['right'],ENT_QUOTES,'UTF-8')?></td>
<td bgcolor = "ffff00"><?=htmlspecialchars($row['left'],ENT_QUOTES,'UTF-8')?></td>
<td bgcolor = "ffff00"><?=htmlspecialchars($row['Rear'],ENT_QUOTES,'UTF-8')?></td>
<td><?=htmlspecialchars($row['備考'],ENT_QUOTES,'UTF-8')?></td>
</tr>
<?php
}
?>

エラー内容がこちら
Warning: Undefined variable $rows in C:\xampp\htdocs\teihoku01\pdo_search.php on line 85

Warning: foreach() argument must be of type array|object, null given in C:\xampp\htdocs\teihoku01\pdo_search.php on line 85

どんな原因なのでしょうか…

質問者からの補足コメント

  • うーん・・・

    //レコード件数取得
    $row_count = $statement->rowCount();
    while($row = $statement->fetch()){
    $rows[] = $row; ←これが間違ってますか?
    }
    }else{
    $errors['error'] = "検索失敗しました。";
    }
    //データベース接続切断
    $dbh = null;
    }
    }catch (PDOException $e){
    print('error:'.$e->getMessage());
    $errors['error'] = "データベース接続失敗しました。";
    }
    ?>

      補足日時:2021/07/31 00:01
  • うれしい

    くんこばさん、naktakさん、Ogre7077さん、
    回答をいただき大変ありがとうございました!親身になって教えていただき感謝しております。
    すべての方をベストアンサーにしたいのですが、くんこばさん、naktakさんの助言とOgre7077さんの解説文を参考にし勉強させていただきます。
    ありがとうございました。

      補足日時:2021/08/01 15:49

A 回答 (7件)

定義されていない変数エラーは、


当然ながら定義処理が抜けているから発生します。

if や for や while 文のブロック中で変数定義している場合、
条件によってはブロック内が実行されないので、
エラーが発生する可能性が常に付きまといます。

事前に変数を初期化する定義を加えるか、
$x = array();
if (...) { $x[] = 42; }
foreach ($x as $i) { ...

変数が定義されているかの判定を加えましょう
if (...) { $x[] = 42; }
if (isset($x)) foreach ($x as $i) { ...
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
>事前に変数を初期化する定義を加えるか、
$x = array();
if (...) { $x[] = 42; }
foreach ($x as $i) { ...

変数が定義されているかの判定を加えましょう
if (...) { $x[] = 42; }
if (isset($x)) foreach ($x as $i) { ...

この文の意味を理解した上で参考にさせていただきます。
頑張ってみます!ありがとうございました!

お礼日時:2021/08/01 15:36

SQLの結果があろうがなかろうが、あらかじめ$rows[]を宣言したらいかがですか。


デバッグしてみて、それが原因かどうかを確認してみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます!
まずはその原因を確認してみてからですね。
やってみます!

お礼日時:2021/08/01 15:33

スマートかどうかは置いておいて、そこ自体には問題ないかもしれません。



そこ確実に通っているんですか?
クエリの結果が1件もなかったら、$rows[]は宣言されていないことになり、配列変数ではないので、質問通りのエラーになりそうな気がしますね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
それは…どこを修正したらよいでしょうか…。難しい…

お礼日時:2021/07/31 22:33

前段の処理で、クエリが間違っていたり、そもそも処理が間違っていたりして、$rowsに値を代入している箇所で、正しく値を代入できていないんでしょうね。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

$dbh = new PDO($dsn, $user, $password);
$statement = $dbh->prepare("SELECT * FROM wiper_s WHERE Manufacturer LIKE (:Manufacturer_1) ");

if($statement){
$Manufacturer = $_POST['Manufacturer_1'];
$like_Manufacturer = "%".$Manufacturer."%";
//プレースホルダへ実際の値を設定する
$statement->bindValue(':Manufacturer_1', $like_Manufacturer, PDO::PARAM_STR);
$errors = array();

if($statement->execute()){
//レコード件数取得
$row_count = $statement->rowCount();

while($row = $statement->fetch()){
$rows[] = $row;   ←ここですか??
}

}else{
$errors['error'] = "検索失敗しました。";
}

お礼日時:2021/07/31 00:04

ここでの処理の内容は理解しているのかな?


もう一度、ちゃんと参考書を読んだ方がいい。

あと、参考書通りに打ち込んでも誤植の場合がある。
信じ切ってはダメよ。
    • good
    • 0
この回答へのお礼

処理の内容は、その都度参考書やネットを利用して調べているのですが
いまいち理解が追い付かず…。sql文を書いて、エラー解析して、意味を調べて、を繰り返しながら進めてます。
でも実際のところなんとなく意味はわかっても、参考にしているものと作ったものを照らし合わせてどういう文にしたらいいのかが理解できていないです。

お礼日時:2021/07/30 23:46

https://techacademy.jp/magazine/4978

その$rowsは、配列として存在してる?
設定してる?

この配列は宣言されてませんよ、ってエラーなのよ。
    • good
    • 0
この回答へのお礼

つまり $rows = ~ が抜けているってことですか??

お礼日時:2021/07/30 23:23

エラーは翻訳した?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
警告: foreach() 引数は配列|オブジェクト型でなければなりません
とのことなんですが…参考書を見ているのですがどうしたらいいのか…

お礼日時:2021/07/30 23:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!