2

現在、比較的大きな HTML フォーム (100 以上のフィールド) を使用しています。そのフォームからデータを取得し、使用が送信されたときにそれを mySQL データベースにアップロードしたいと考えています。以下の PHP コードを作成し、ゆっくりとフィールドを追加して、接続が成功するかどうかをテストしています。すべてが $skilled_nursing で機能していましたが、次の値のセットを追加すると、データベース エントリが正常に作成されなくなりました。すべてのエコー コマンドが表示され、エラー ログにエラーが記録されていませんが、データベースでデータが受信されていません。

誰が何がうまくいかないのか見ることができますか? スペルミスがないか何度もチェックしましたが、見当たりませんでした。どういうわけか接続でタイムアウトしているのか、それとも実行コマンドにあまりにも多くの値を入れようとしているのだろうかと思っています。

<?php

echo 'started ok';
// configuration
$dbtype     = "mysql";
$dbhost     = "localhost";
$dbname     = "dbname";
$dbuser     = "dbuser";
$dbpass     = "userpass";
echo 'variables assigned ok';
// database connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
echo 'connection established';
// new data
$facility_name = $_POST['facility_name'];
$facility_street = $_POST['facility_street'];
$facility_county = $_POST['facility_county'];
$facility_city = $_POST['facility_city'];
$facility_state = $_POST['facility_state'];
$facility_zipcode = $_POST['facility_zipcode'];
$facility_phone = $_POST['facility_phone'];
$facility_fax = $_POST['facility_fax'];
$facility_licensetype = $_POST['facility_licensetype'];
$facility_licensenumber = $_POST['facility_licensenumber'];
$facility_email = $_POST['facility_email'];
$facility_administrator = $_POST['facility_administrator'];
$skilled_nursing = $_POST['skilled_nursing'];
$independent_living = $_POST['independent_living'];
$assisted_living = $_POST['assisted_living'];
$memory_care = $_POST['memory_care'];
$facility_type_other = $_POST['facility_type_other'];
$care_ratio = $_POST['care_ratio'];
$nurse_ratio = $_POST['nurse_ratio'];



// query
$sql = "INSERT INTO Facilities (facility_name, facility_street, facility_county, facility_city, facility_state, facility_zipcode, facility_phone, facility_fax, facility_licensetype, facility_licensenumber, facility_email, facility_administrator, skilled_nursing, independent_living, assisted_living, memory_care, facility_type_other, care_ratio, nurse_ratio) VALUES (:facility_name, :facility_street, :facility_county, :facility_city, :facility_state, :facility_zipcode, :facility_phone, :facility_fax, :facility_licensetype, :facility_licensenumber, :facility_email, :facility_administrator, :skilled_nursing, :independent_living, :assisted_living, :memory_care, :facility_type_other, :care_ratio, :nurse_ratio)";
$q = $conn->prepare($sql);
$q->execute(array(':facility_state'=>$facility_name,
':facility_street'=>$facility_street,
':facility_county'=>$facility_county,
':facility_city'=>$facility_city,
':facility_state'=>$facility_state,
':facility_name'=>$facility_name,
':facility_zipcode'=>$facility_zipcode,
':facility_phone'=>$facility_phone,
':facility_fax'=>$facility_fax,
':facility_licensetype'=>$facility_licensetype,
':facility_licensenumber'=>$facility_licensenumber,
':facility_email'=>$facility_email,
':facility_administrator'=>$facility_administrator,
':skilled_nursing'=>$skilled_nursing,
':independent_living'=>$independent_living,
':assisted_living'=>$assisted_living,
':memory_care'=>$memory_care,
':facility_type_other'=>$facility_type_other,
':care_ratio'=>$care_ratio,
':nurse_ratio'=>$nurse_ratio));

echo 'query parsed';

?>
4

1 に答える 1

1

これは、コードの何が問題なのかを正確に解決するものではありませんが、解決に役立つ可能性があります。

私はこれを少し違う方法で行います。畑が多いとおっしゃいます。コードが非常に長くなり、繰り返しになる可能性があります。フォーム フィールド名が既にテーブルの列に対応しているように見えるので、次のようにします (テストされていません)。

// get a list of column names that exist in the table
$sql = "SELECT column_name FROM information_schema.columns WHERE table_name = 'Facilities'";
$q = $conn->prepare($sql);
$q->execute();
$columns = $q->fetchAll(PDO::FETCH_COLUMN, 0);

$cols = array();
foreach ($_POST as $key=>$value)
{
    // if a field is passed in that doesn't exist in the table, remove it
    if (!in_array($key, $columns)) {
        unset($_POST[$key]);
    }
}

$cols = array_keys($_POST);
$sql = "INSERT INTO Facilities(". implode(", ", $cols) .") VALUES (:". implode(", :", $cols) .")";
$q = $conn->prepare($sql);
array_walk($_POST, "addColons");
$q->execute($_POST);

function addColons($value, &$key)
{
    $key = ":{$key}";
}

この方法では、10、100、または 1000 のフィールドを持つことができ、このコードをまったく変更する必要はありません。また、列名を指定する場所が 1 か所しかないため、タイプミスの可能性も減少します。クエリでの使用を許可する前に列が存在することを確認するため、列名の SQL インジェクションについて心配する必要はありません。

$_POSTもちろん、これは、経由で渡されたすべてのフィールドがテーブルの列名に対応していることを前提としています。そうでない場合は、列ではない特定のフィールド値を別の変数に格納し、unset()それらを$_POST配列から格納するのが最も簡単な場合があります。

于 2012-09-24T17:52:38.013 に答える