2009-11-04 16 views
7

いつものように、私はPHPでベストプラクティスを考えていました。だから、私が見つけたいくつかの例で遊んで始めました。bindParam()のMysqli Prepared Statementが動作しない

スクリプトを実行しているとき、私はこのエラーを持っている:

Fatal error: Call to a member function bindParam() on a non-object in /opt/lampp/htdocs/phpSecurity/PreparedStatments/Insert-Multi-Binded-Params/Insert Simple Method.php on line 10

ここでは、コードを行きます。

Method.php

<?php 
require_once '../config.php'; 

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 

$nome = 'Fabio Antunes'; 
$telefone = 916810641; 
$bi = 123093456; 

$stmt->bindParam(1, $nome); 
$stmt->bindParam(2, $telefone); 
$stmt->bindParam(3, $bi); 

$stmt->execute(); 

$stmt->close(); 

$db->close(); 
?> 

config.phpの

<?php 
$server_host = 'localhost'; 
$server_user = 'root'; 
$server_password = ''; 
$server_db = 'PreparedStatements'; 
$db = new mysqli($server_host, $server_user, $server_password, $server_db); 
?> 

シンプル挿入しないで、私はここで間違ってやっていることを確認、これはphp.netで見つかった同様の例があり、なぜ動作していないのですか? PS:私はSELECT SQLコマンドでいくつかのプリペアドステートメントを実行するために使用したので、mysqli接続は問題ではないと思います。そしてかなりうまくいった。


EDIT

解像度とその理由。

よく、example私はクエリの各値にbind_param()を使用する必要があります。しかしBartのおかげで、彼は私のコードで問題を解決することができました。

$stmt->bindParam(1, $nome); 
$stmt->bindParam(2, $telefone); 
$stmt->bindParam(3, $bi); 

それは次のようになります:

$stmt->bind_param("sii", $nome, $telefone, $bi); 

今 "SII" であるか疑問に思うかもしれない人のためにそれがある

私はそれが "$ var"をそれぞれの疑問符 "?"順番に。

したがって、1つでbind_param()私はそれらをすべて同時にバインドすることができ、bind_param()の通常の使用では、バインドされるデータの種類を指定する必要があります。

私が最初にバインドする値は、$nome "s"で指定された文字列です。

$telefone$biは、 "i"を持っているため整数です。

他にも同様の問題がありますが、他のデータタイプ(php.netから)になります。

i = Integer;

s = String;

d = Double;

b = Blob;

誰かがより良い説明として投稿またはコメントしてください。だから私は自分自身を改善することができます。

ありがとうございました。

答えて

6

あなたは、接続と間違って何もないと思うかもしれませんが、確認するためにチェックする必要があります:

$db = new mysqli($server_host, $server_user, $server_password, $server_db); 
if (mysqli_connect_errno()) { 
    printf("DB error: %s", mysqli_connect_error()); 
    exit(); 
} 

はEDIT:

あなたが行うとき、何が起こる:

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 
$stmt->bind_param("sii", $nome, $telefone, $bi); 
$stmt->execute(); 

coisasは正しく表記されていますか?

+0

ベストプラクティスのための良い提案。私は試しましたが、問題を解決しませんでした。他のアイデア? –

+0

$ stmt-> bind_param( "sii"、$ nome、$ telefone、$ bi);働いた。 –

+0

お買いものに役立つ情報交換ができます。 –

2

$ stmtでline4に戻った後にprint_rを実行します。実際のオブジェクトですか?私はないと思います。

+0

それが何をするかわからない。問題は、私は各値のバインドparamを使用しているので、私はちょうど1つしか使うことができず、値の入力タイプ(s = string | i = integer)については言及していませんでした。とにかくありがとう。 –

+0

エラーは、メソッドを呼び出すオブジェクト($ stmt)が実際にオブジェクトではないことを示しています。それはその方法の中で起こった可能性がありますが、私の最初の推測は、最初はnull $ stmtであったということでした。 – Zak

関連する問題