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

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

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

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

1回答

2018閲覧

PHPをバージョンアップしたらSQLの結果が返らなくなった

version-l

総合スコア15

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

2クリップ

投稿2020/02/23 10:58

前提・実現したいこと

お世話になります。
PHPの簡単なシステムを社内で運用しています。
phpMyAdminをバージョンアップしたことに伴い、PHPの方もバージョンを上げると、あるSQLの結果が返らなくなりました。

今までのバージョンPHP5.6
PHP7.1 →正常な値が返る
PHP7.2 →値が返らなくなった
PHP7.3 →値が返らなくなった

このことから7.1から7.2の変更点に原因があると考え調べてみましたが自分のレベルでは理解できませんでした。
※phpMyAdminからの要求は7.1で大丈夫なのですが、どうせなら7.3にしたいと考えております。

HTML

1<form action="" method="post"> 2 年月日<br> 3 <input type ="text" class="hidutext" name="tdate" value="<?php echo date('Y-m-d'); ?>"><br><br> 4 氏名<br> 5 <select name="a2" class="hidutext"> 6 <option value=""><? echo '全員を選択'; ?></option> 7 8<?php 9while($roo1 = $stt1->fetch()){//ここには記載していませんが事前にSQL文が存在します。 10 echo '<option value="'.htmlspecialchars($roo1['namae']).'">'.htmlspecialchars($roo1['namae']).'</option>'; 11 } 12?> 13 </select><br> 14 <input type ="submit" name="seach" value=" 検索 "> 15</form> 16 17<?php 18if(isset($_POST['seach'])){ 19 try{ 20 include '../tools/dbconnect.php';//db接続 21 $a2 = $_POST['a2']=="" ? '%' : $_POST['a2']; 22 $tdate = $_POST['tdate']; 23 $sql02 = "select max(id) as maxid from status_tbl where name like :a2 and s5 = :tdate group by s9"; 24 $str02 = $pdo->prepare($sql02); 25 $str02->bindvalue(':a2',$a2,PDO::PARAM_STR); 26 $str02->bindvalue(':tdate',$tdate,PDO::PARAM_INT); 27 $str02->execute(); 28 29 $zdata = $str02->fetchAll();//sqlの全結果を取得、配列に格納 30 31 if (!empty($zdata)) { ///データが存在する場合 32 $id = array_column($zdata, 'maxid');//カラムmaxidの値のみを配列に格納 33 $sql03 = "select id, name, datetime, s1, s5, s7, s9 from status_tbl where id IN(".implode(",",$id).")";//抽出条件 maxid 34 $str03 = $pdo->query($sql03); 35 36 while($row03 = $str03->fetch()){ 37 $sai = $row03['s7']=='最新' ? '【最新】': '【※次あり】'; 38 echo '<form action="data_input.php" method="post">'; 39 echo '<input type ="hidden" name ="maxid" value ="'.$row03['id'].'">'; 40 echo '<input type ="hidden" name="muid" value ="'.$row['s9'].'">'; 41 42 echo '<button type ="submit" name ="data_sentaku" value="">'.$sai.'<br>'.$row03['name'].'<br>'.$row03['s1'].'</button>'; 43 44 echo '</form>'; 45 } 46 47 }else{$a = $a2=='%'?'全員':$a2; echo '[氏名] '.$a.'<br>[日付] '.$tdate.'<h3>該当するデータは存在しません。</h3>';}///データが存在しない場合 48 49 }catch (PDOException $e){ 50 print('Error:'.$e->getMessage()); 51 die(); 52 $pdo = null;} 53 echo '<br><br>'; 54} 55?>

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

このIF文の結果がPHP7.2以上だとFALSEになってしまいます。

PHP

1if (!empty($zdata)) { }

なので以下の式に問題があるのではと考えています。
どうか宜しくお願い致します。

$sql02 = "select max(id) as maxid from status_tbl where name like :a2 and s5 = :tdate group by s9"; $str02 = $pdo->prepare($sql02); $str02->bindvalue(':a2',$a2,PDO::PARAM_STR); $str02->bindvalue(':tdate',$tdate,PDO::PARAM_INT); $str02->execute();

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

お名前.COM 共有サーバ
php5.6.40(今まで)
phpMyAdmin5.0.1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/23 11:02

タグとコードからみるに mysqli と pdo をまぜこぜにしてるつぎはぎコードはやめましょう。
退会済みユーザー

退会済みユーザー

2020/02/23 11:04

あときっかけは phpMyAdmin の更新だとしても コードとなんの関係が?
hoshi-takanori

2020/02/23 11:32

tdate は日付ですよね。デフォルト値に - が入ってるのに bindvalue は INT 型でいいのでしょうか?
takasima20

2020/02/23 11:59

再現操作に問題はなく、SQLを直に手入力しても正常で、エラーも発生してないってんなら、あとはログになんか出てないか確認するくらいかなあ。
version-l

2020/02/23 12:21

>>まぜこぜにしてるつぎはぎコード 独学のド素人につき何卒お許しを! >>bindvalue は INT 型でいいのでしょうか? ありがとうございます INT→STRで動きました
version-l

2020/02/23 12:26

takasima20様 回答ありがとうございます
退会済みユーザー

退会済みユーザー

2020/02/23 12:32

そもそも、共有サーバー上に phpmyadmin 入れないでも、お名前.comが用意してるのに意味がわからない(規約上大丈夫だとは思うが)
version-l

2020/02/23 12:52

asahina1979様 ありがとうございます 私の契約しているプランではphpmyadminは公式ページでDLして自分でFTPでアップせよとのことでしたが、もしかしてお名前.COMが他のDB操作ツールを提供しているという意味なのでしょうか
takasima20

2020/02/24 11:38

なるほど~ PHPが生SQLを生成する際の問題でしたか。ひょっとしたら PHP と MySQL 両方のバージョンの組み合わせで事象が異なるのかなあ。勉強になりました。
guest

回答1

0

ベストアンサー

色々ツッコミが必要なコードですが、見なかったことにして、回答します。
(いや、回答にもなってないかも知れないですが^^;)

php

1 $str02->bindvalue(':tdate',$tdate,PDO::PARAM_INT);

ここの$tdateは int へキャストすると値が変化します。
私自身は検証できていないし、ドキュメントも探せてないのですが、リンク先のような現象が観測されています。

PHP5.6とPHP7.3でPDO::PARAM_INTの挙動が変わる

もしコレなら、原因が分かる人のコメントも欲しいなぁ。。。

#追記
再現条件を確認しました。

あの PDO::PARAM_INT の挙動が変更になってる!

7.2 以降かつエミュレーションの有無で結果が分かれるようです。

#さらに追記
徳丸さんが日記を書かれたのでリンクしときます。

PHP 7.2以降におけるPDO::PARAM_INTの仕様変更

投稿2020/02/23 11:48

編集2020/03/27 08:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

version-l

2020/02/23 12:43

ありがとうございます ほかの方のご指摘により、INT→STRで解決いたしましたが、7.1では動いていた為、 「PHP5.6とPHP7.3でPDO::PARAM_INTの挙動が変わる」件も一つの原因であったと思います
退会済みユーザー

退会済みユーザー

2020/02/24 00:41

>asahina1979 さん その記事の下の方にある「PDOでの数値列の扱いにはワナがいっぱい(2)」に説明がありますが、PDO の PDO::PARAM_INT は期待した機能を果たさず STR のまま投入され、今回のケースでは「日付文字列」として動作します。 が、新環境では、「正しく int へ変換」されるようになったため、問題が発生していたのだと思います。 ただ、私はいくつか環境を作ってみたのですけど、再現したことがないので、「正しく int へ変換」される原因が何なのかわかっていません。 結構インパクトのある挙動だと覆うのですけど、根拠が探せなくてちょと困ってます^^;
退会済みユーザー

退会済みユーザー

2020/03/02 13:01

再現条件を確認しました。 あの PDO::PARAM_INT の挙動が変更になってる! https://qiita.com/te2ji/items/a8e7211a69f313126f7c 7.2 以降かつエミュレーションの有無で結果が分かれるようです。
退会済みユーザー

退会済みユーザー

2020/03/27 10:16

なんであがってきたんやろ
退会済みユーザー

退会済みユーザー

2020/03/27 11:29

おれが回答にリンク追記したためかと。
退会済みユーザー

退会済みユーザー

2020/03/27 11:35

↑うったときそのリンクなかったw
退会済みユーザー

退会済みユーザー

2020/03/27 11:38

なんでだろ。なんかのキャッシュバグ踏んだかな? まぁ、やっとメジャーな人が取り上げてくれたんで、コレで悩む人が減るといいのだけれど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問