

このエラーの原因が分からないです。  
お手数ですが、教えて頂けると助かります。  
よろしくお願いします。

#### エラー内容

[code]

    Fatal error: Uncaught Error: Call to a member function bindParam() on string in /home/users/2/lolipop.jp-7084e0fe7e215321/web/study/mysql/login.php:21 Stack trace: #0 {main} thrown in /home/users/2/lolipop.jp-7084e0fe7e215321/web/study/mysql/login.php on line 21
    
[/code]

#### ソースコード

[code]

    <?php
    ini_set('display_errors', 1);
    
    require './library.php';
    $err = [];
    $email = '';
    $pass = '';
    $stmt='';
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
        $pass = filter_input(INPUT_POST, 'pass', FILTER_SANITIZE_STRING);
        if ($email === '' || $pass === '') {
            $err['login'] = 'blank';
        } else {
            $db = connect();
            $stmt = $db->prepare('select id,name,pass from members where email=:email limit 1');
            if (!$stmt) {
                die($db->error);
            }
        }
        $stmt->bindParam(':email', $email, PDO::PARAM_STR);
        $success = $stmt->execute();
        if (!$success) {
            die($db->error);
        }
        $hash = $stmt->fetchColumn(2);
        $stmt->fetch();
        if (password_verify($pass, $hash)) {
        } else {
            $err['login'] = 'failed';
        }
    } ?>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <link rel="stylesheet" type="text/css" href="style.css" />
      <title>ログインする</title>
    </head>
    
    <body>
      <div id="wrap">
        <div id="head">
          <h1>ログインする</h1>
        </div>
        <div id="content">
          <div id="lead">
            <p>メールアドレスとパスワードを記入してログインしてください。</p>
            <p>入会手続きがまだの方はこちらからどうぞ。</p>
            <p>&raquo;<a href="join/">入会手続きをする</a></p>
          </div>
          <form action="" method="post">
            <dl>
              <dt>メールアドレス</dt>
              <dd>
                <input type="text" name="email" size="35" maxlength="255" value="<?php echo h($email); ?>" />
                <?php if (isset($err['login']) && $err['login'] === 'blank') : ?>
                  <p class="error">メールアドレスとパスワードを入力して下さい</p>
                <?php endif; ?>
                <?php if (isset($err['login']) && $err['login'] === 'failed') : ?>
                  <p class="error">ログインに失敗しました</p>
                <?php endif; ?>
              </dd>
              <dt>パスワード</dt>
              <dd>
                <input type="password" name="password" size="35" maxlength="255" value="<?php echo h($pass); ?>" />
                <?php if ($err['login'] === 'blank') : ?>
                  <p class="error">パスワードを入力して下さい</p>
                <?php endif; ?>
              </dd>
              <dt>ログイン情報の記録</dt>
              <dd>
                <input id="save" type="checkbox" name="save" value="on">
                <label for="save">次回からは自動的にログインする</label>
              </dd>
            </dl>
            <div>
              <input type="submit" value="ログインする" />
            </div>
          </form>
        </div>
        <div id="foot">
          <p><img src="images/txt_copyright.png" width="136" height="15" alt="(C) H2O Space. MYCOM" /></p>
        </div>
      </div>
    </body>
    </html>
    
[/code]


CC BY-SA 4.0
2022-02-10T13:22:48.920
86256
2022-02-10T15:35:07.560
2022-02-10T15:35:07.560
3060
51370
question
php mysql
Call to a member function bindParam() on string


エラーメッセージから考えると「$stmtが文字列なのにbindParam()を呼び出そうとしている」となります。  
つまり

[code]

    $stmt='';
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
    $pass = filter_input(INPUT_POST, 'pass', FILTER_SANITIZE_STRING);
    if ($email === '' || $pass === '') {
        $err['login'] = 'blank';
    } else {
        $db = connect();
        $stmt = $db->prepare('select id,name,pass from members where email=:email limit 1');
        if (!$stmt) {
            die($db->error);
        }
    }
    $stmt->bindParam(':email', $email, PDO::PARAM_STR);
    
[/code]

先頭で`$stmt='';`と初期化したままの`$stmt`に対して`bindParam()`を呼び出そうとしてエラーになっているのでしょう。  
`$email`が空もしくは`$pass`が空なので、データベース接続をせずにif文を抜けているためだと考えられます。ちゃんと`$email`と`$pass`に値が入っているか確認してみてください。


CC BY-SA 4.0
2022-02-10T14:25:07.097
86257
2022-02-10T14:25:07.097
9515
86256
answer