前提・実現したいこと
PHPでサービスを作ってます。
別のページでは動いているPDOの命令が動きません。
バインドに問題があると思いますが、いろいろ試しましたがわかりませんでした。
よろしくお願いします。
環境 PHP Version 7.4.1 mamp使用 phpMyAdmin バージョン情報: 4.9.3
発生している問題・エラーメッセージ
出力が空で返ってきます。
PHP
1array(0) { }
該当のソースコード
PHP
1<?php 2$post_choose_offer = $_POST['choose_offer']; 3 4echo $post_choose_offer; 5 6□□□□□□□□□□ ここでは 5f5383012c89e が返ってきています。 □□□□□□□□□□ 7 8try { 9 10 // データベースに接続 11 require_once('../〇〇〇〇/db_connection.php'); 12 13 // sql文を作成 14 // POSTで渡されたoffer_codeがデータベース内に存在するかを検索するsql文 15 $prepare = $pdo->prepare('SELECT * FROM offer WHERE offer_code = :offer_code'); 16 17 18 19 // sql文のバインド処理 20 // [ :offer_code ]を$post_choose_offerでバインド 21 $prepare->bindValue(':offer_code', (string) $post_choose_offer, PDO::PARAM_STR); 22 23 // sql文実行 24 $prepare->execute(); 25 26 // データベースからの戻り値を受け取り、変数に格納 27 $offer_data = $prepare->fetchAll(PDO::FETCH_ASSOC); 28 29 30 31} catch (PDOException $e) { 32 echo '接続エラー' . $e->getMessage() . "\n"; 33 exit(); 34} 35 36 37 echo ' offer_data <br> '; 38 var_dump($offer_data); 39□□□□□□□□□□ ここでarray(0) { }が返ってきています。 □□□□□□□□□□ 40
試したこと
以下のコードで、バインドせずに直接文字列を入れると、DBから欲しい情報が返ってきます。
PHP
1$prepare = $pdo->prepare('SELECT * FROM offer WHERE offer_code = "5f5383012c89e"');
念のためにPOSTを受けた直後にキャストもしましたが、変化なし。
PHP
1(string)$post_choose_offer
fetchAll を fetch でも変化なし。
###追記
var_dumpで出力した結果
PHP
1var_dump($post_choose_offer);
HTML
1string(14) " 5f5383012c89e"
変数に文字列を入れてバインドした結果。
PHP
1$post_choose_offer = "5f5383012c89e";
こちらで欲しい情報が取れました。
ですので、バインドの問題では無いのかな?
PHP
1$prepare->PDOStatement::debugDumpParams();
こちらで出力すると
HTML
1SQL: [54] SELECT * FROM offer WHERE offer_code = :offer_code 2Params: 1 3Key: Name: [11] :offer_code 4paramno=0 5name=[11] ":offer_code" 6is_param=1 7param_type=2 8
出力の内容をまだ理解して無いので、調べている途中です。
むやみにキャストしてはいけないとご意見を頂いたので、以下に変更しました。
ありがとうございます。
PHP
1$prepare->bindValue(':offer_code', $post_choose_offer, PDO::PARAM_STR);
###解決
form側でスペースが混入していたのに気付きませんでした。
アホでした。
HTML
1string(14) " 5f5383012c89e"
回答を頂いたみなさま、大変ありがとうございました。
回答3件
あなたの回答
tips
プレビュー