2017-03-02 13 views
0

PHP関数内でDRYの原理に違反することなくmysqliクエリを使用することはできません。私の関数の前に、私はMySQLの構成コード以下のいる :php関数はmysqli接続を認識しません

//database configuration 
$config['mysql_host'] = "myhost.eu-west-2.rds.amazonaws.com"; 
$config['mysql_user'] = "mylogin"; 
$config['mysql_pass'] = "mypassword"; 
$config['db_name'] = "mydbname"; 
$config['table_name'] = "mytablename"; 
$connection = mysqli_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass'], $config['db_name']); 

そして、私の関数は次のようになります。

function writeLog($isError, $connection) { 
    global $ipLong, $datetime, $procedure_index, $gotResults; 
    $sql = "INSERT INTO user_log VALUES (NULL, "; 
    $sql .= "\"$ipLong\", \"$datetime\", \"$procedure_index\", \"$gotResults\", \"$isError\""; 
    $sql .= ");"; 
    mysqli_query($connection, $sql); 
} 
:私も、このような入力変数などの接続を送信しようとした

function writeLog($isError) { 
    global $connection, $ipLong, $datetime, $procedure_index, $gotResults; 
    $sql = "INSERT INTO user_log VALUES (NULL, "; 
    $sql .= "\"$ipLong\", \"$datetime\", \"$procedure_index\", \"$gotResults\", \"$isError\""; 
    $sql .= ");"; 
    mysqli_query($connection, $sql); 
} 

どちらも動作していません。私が見つけた唯一の可能性は、自分のデータベース構成をコピーして私の関数に貼り付けるときですが、オプションではありません。私は複数の関数でクエリを実行する必要があるからです。どうすれば修正できますか?

P.S.悪いが、コードを作業:

//database configuration 
$config['mysql_host'] = "myhost.eu-west-2.rds.amazonaws.com"; 
$config['mysql_user'] = "mylogin"; 
$config['mysql_pass'] = "mypassword"; 
$config['db_name'] = "mydbname"; 
$config['table_name'] = "mytablename"; 
$connection = mysqli_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass'], $config['db_name']); 

function writeLog($isError) { 
    //database configuration, again. totally violating DRY principle. 
    $config['mysql_host'] = "myhost.eu-west-2.rds.amazonaws.com"; 
    $config['mysql_user'] = "mylogin"; 
    $config['mysql_pass'] = "mypassword"; 
    $config['db_name'] = "mydbname"; 
    $config['table_name'] = "mytablename"; 
    $connection = mysqli_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass'], $config['db_name']); 

    global $ipLong, $datetime, $procedure_index, $gotResults; 
    $sql = "INSERT INTO user_log VALUES (NULL, "; 
    $sql .= "\"$ipLong\", \"$datetime\", \"$procedure_index\", \"$gotResults\", \"$isError\""; 
    $sql .= ");"; 
    mysqli_query($connection, $sql); 
} 
+0

** WARNING **:あなたが使用する必要がありますmysqli' '使用する場合は、[パラメータ化クエリ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と[ 'bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)を使用して、クエリにユーザーデータを追加します。 **重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成したため、文字列の補間または連結を使用してこれを実行しないでください。 ** '$ _POST'、' $ _GET'、**任意の**ユーザデータを直接クエリーに入れないでください。誰かがあなたのミスを悪用しようとすると非常に危険です。 – tadman

+0

ヒント:小さくしてください。築き上げる。たとえば、関数内に大きなクエリをハードコーディングしないなど、モジュール化したものをモジュール化してください。頻繁にテストし、何かが壊れたときに注意を払う。バージョンコントロールを使用して欠陥を特定する。 – tadman

+0

「見えません」と定義します。あなたのコードは色盲ですか、サングラスをかけていますか? –

答えて

0

globalキーワードを使用し、接続変数のスコープを変更し、データベース接続変数を含む関数のパラメータとしては、このタスクを達成するために、両方の有効な方法です。

しかし、両方とも機能していないため、関数呼び出しの前に以前に開いた接続を閉じている可能性があります。

mysqli_close($connection); <== Closed connection. 

function writeLog($isError) <== Results in Error 
function writeLog($isError, $connection) <== Results in Error 
関連する問題