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

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

ただいまの
回答率

90.51%

  • PHP

    24065questions

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

  • PDO

    382questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

pdo ステートメントエラーに付いて教えて下さい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 436

Sora-tan

score 610

他のレンタルサーバーで動作確認した時点で問題の無かったソースなんですが..CPI(共有サーバー)に移設すると >  Call to a member function execute() on boolean in
でエラーになってしまいます。

        $pdo = new mysqli(HOST,DBUSER,DBPASS,DBNAME,PORTNUMBER);
        $pdo->set_charset('utf8');
        if(!$pdo){
            --割愛--
            throw new PDOException();
        }


        $stmt = $pdo -> prepare('SELECT count(*) FROM `account` WHERE `id`=:val1 and `pass`=:val2');
        $stmt -> execute(array('val1' => $user, 'val2' => $pass));//ここにエラーが出ます。
        $count = $stmt -> fetchColumn();
        if (!$count){
                   -------割愛-------
        }


どう対処したらいい物か全くわかりません。
どなたか 詳しく教えて下さい。宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2018/08/30 16:27

    「PHP」もタグに追加しておいてください。確かにPDOはPHPの機能ですが、PHPの文法に誤りがあったりロジックに間違いがある場合、PDOの知識だけではおさまらない可能性もあります(もちろんPDOの知識があってPHPの知識がないということはありえませんが、なるべく関連するものはタグ付けしておいた方がよいです)

    キャンセル

  • Sora-tan

    2018/08/30 16:40

    はい ありがとうございます

    キャンセル

  • mts10806

    2018/08/30 16:44

    接続部分のコードも全てのせてください。パスワードなどは仮のものに差し替えた上で

    キャンセル

  • Sora-tan

    2018/08/30 16:44

    了解しました...

    キャンセル

回答 3

checkベストアンサー

+4

Call to a member function execute() on boolean in

これから、$stmt が boolean であることがわかります。

http://php.net/manual/ja/pdo.prepare.php
prepare を確認すると、成功時には PDOStatement オブジェクト、失敗時には falseを返すとかkれているので、今回の場合、falseを返しているはずです。

となると、$pdo が正しく PDO オブジェクトを返しているかどうかを確認する必要がある。

var_dump($pdo); で確認することが先決です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/30 16:11

    ありがとうございます。
    確認してみます!

    キャンセル

  • 2018/08/30 16:22

    dumpを取りましたところ
    object(mysqli)#1 (19) {
    ["affected_rows"]=>
    int(0)
    ["client_info"]=>
    string(6) "5.6.38"
    ["client_version"]=>
    int(50638)
    ["connect_errno"]=>
    int(0)
    ["connect_error"]=>
    NULL
    ["errno"]=>
    int(0)
    ["error"]=>
    string(0) ""
    ["error_list"]=>
    array(0) {
    }
    ["field_count"]=>
    int(0)
    ["host_info"]=>
    string(20) "--割愛-- via TCP/IP"
    ["info"]=>
    NULL
    ["insert_id"]=>
    int(0)
    ["server_info"]=>
    string(6) "--割愛--"
    ["server_version"]=>
    int(50638)
    ["stat"]=>
    string(151) "Uptime: --割愛--"
    ["sqlstate"]=>
    string(5) "00000"
    ["protocol_version"]=>
    int(10)
    ["thread_id"]=>
    int(--割愛--)
    ["warning_count"]=>
    int(0)
    }

    出戻ってきました。
    ステートメントを通した前後で変わりは無いようです....

    キャンセル

  • 2018/08/30 16:25 編集

    object(mysqli)#1 (19) ←ここをみてへんだと思いませんかね?

    mysqliを使っていながら、$pdo という変数名にしているクソコードを直すことから必要かも。わざわざ罠を自ら作って保守性を損なっています。自分で作った落とし穴に自らはまっている。

    キャンセル

  • 2018/08/30 16:29

    すみません..まったくわかりません。

    キャンセル

  • 2018/08/30 16:30

    $pdo を作っている部分のコードを見直しましょう。

    キャンセル

  • 2018/08/30 16:37

    なんでこんな現象が発生するんだろ。。。
    すげぇ不思議なんだけど。

    キャンセル

  • 2018/08/30 16:38

    mysqli_*系関数でDB接続しておきながら、そのオブジェクトをPDO系関数で利用しようとしたら、そりゃだめでしょう。
    その混乱の象徴が $pdo なのですよ。
    DB接続箇所のコードも一緒に掲載してみてくださいね。

    キャンセル

  • 2018/08/30 16:38

    mysqliで接続していながら、$pdo と命名していることが全ての元凶だろうと推測しますが。

    キャンセル

  • 2018/08/30 16:42

    コードは全部載せてほしいですねえ…
    質問だけ見たら間違ってはなさそうな回答が無駄になってしまう。

    キャンセル

  • 2018/08/30 16:46

    あぁ、そういうことか^^;
    完全に思考停止してました。命名トラップですね。
    理解できました。ありがとうございます。

    キャンセル

  • 2018/08/30 16:48

    命名って大事ですね。

    キャンセル

  • 2018/08/30 16:54

    PDOとmysqli が別物だ、という理解がまず必要なのではないかと思いました。

    キャンセル

  • 2018/08/30 16:55 編集

    やっと理解出来ました。
    mysqliで接続している事すら解かってませんでした。ありがとうございました。

    キャンセル

+1

PDO::errorInfo

の例1のように、$stmt が false だったら $pdo->errorInfo() を確認すると
原因がわかるかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/30 16:27

    ありがとうございます。CPIさんのばあいは errorInfo() が定義されてないようなんです(T~T)
    undefined method mysqli::errorInfo()になってしまいます。

    キャンセル

  • 2018/08/30 16:47

    「undefined method mysqli::errorInfo()」
    これは、mysqli には errorInfo() がない、という意味です。
    サーバは関係なくて、 Kosuke_Shibuya さんの回答、および議論と同じ話だと思います。

    サーバ移設したときに、初期化コードを変えてしまったのではないですか?

    キャンセル

+1

※PDOを利用する場合に参考にしてください。
もし接続部分をmysqliのままにするのであればやり方がかわります。
どちらを利用するにしても必ずPHPマニュアルを読み、混同しないように気を付けてください

PHPマニュアルを参照してください。

上記マニュアルの例文で下記のようにあります。

<?php
/* 入力値の配列を伴うプリペアドステートメントの実行 */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
?>

SQL内に「:calories」と値を置いた箇所には
execute()では「:calories」をキーに値をセットしていますね。

ご自身のコードと見比べておかしいところに気づきませんか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    24065questions

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

  • PDO

    382questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。