1

PHPとMySQLのクエリ構築は初めてです。昨日、列について同様の質問をしましたが、VALUESについてサポートが必要です。私は大きなフォーム用のプロセッサを持っています。いくつかのフィールドは必須ですが、ほとんどのフィールドはユーザーオプションです。私の場合、HTMLIDとMySQL列名は同じです。配列を使用して$_POSTをINSERTINTOのフィールドと値に変換する方法についてのチュートリアルを見つけましたが、何時間も経っても機能させることができません。配列と変数を使用して非常に単純なINSERTを作成するために一歩下がったが、それでも困惑している。次の行が機能し、5つの変数の値を100を超える列を持つデータベースに挿入します。最初の4つの項目は文字列、5番目の項目、monthlyRentalは整数です。

$colsx = array('country', 'stateProvince', 'city3', 'city3Geocode', 'monthlyRental');
$col_string = implode(',', $colsx);
$query = "INSERT INTO `$table` ($col_string) VALUES ( '$country', '$stateProvince', '$city3', '$city3Geocode', '$monthlyRental')";

この考えに従って、前処理された変数を使用して配列を作成し、それを内包して文字列を作成します。

//these variables are "pre-processed", e.g., $country=$_POST['country'] and validated, but not yet mysql_real_escape_string
$valsx = array( '$country',  '$stateProvince', '$city3', '$city3Geocode', '$monthlyRental' );
$val_string = implode(",", $valsx);
$query = "INSERT INTO `$table` ($col_string) VALUES ( $val_string )";

それは動作しません。多くのことを変更しようとしましたが、結果はありませんでした。このコードで発生するMySQLエラーは次のとおりです-'フィールドリスト'の不明な列'$country'$valsx配列の'$country'を参照していますが、これがフィールドリストであるかわかりません。問題を解決する方法。

提案を具体的に記入してください。私はMySQLとPHPにかなり慣れていません。

OK、Iserniの提案で、これが現在のコードです。実行されません。彼のコードについて助けが必要であり、エラーメッセージをどこにどのように配置するかについて助けが必要です。

$colsx = $fields = $valsx = $values = array();
$colsx = array('country', 'stateProvince', 'city3', 'city3Geocode', 'monthlyRental');
$col_string = implode(',', $colsx);
$valsx = array( "$country",  "$stateProvince", "$city3", "$city3Geocode", "$monthlyRental" );
$val_string = implode(",", $valsx);
foreach($colsx as $col) {
    $fields[] = $col;
    if ( is_numeric($_POST[$col]) ) {
        $values[] = mysql_real_escape_string($_POST[$col]);
    }else{
        $values[] = "'".mysql_real_escape_string($_POST[$col])."'";
    }
}
$fields_sql = implode(',', $fields);
$values_sql = implode(',', $values);
$query = "INSERT INTO `$table` ($fields_sql) VALUES ($values_sql);"
if (!mysql_query($query,$conn))
{
    die('<li class=error>an error occurred posting to the database. </li>'. mysql_error());
}
4

3 に答える 3

1
$valsx = array( '$country',  
                '$stateProvince',
                '$city3',
                '$city3Geocode',
                '$monthlyRental'
         );

一重引用符を使用すると、ここに記述されているリテラル文字が出力されます。代わりに二重引用符で囲むと、変数の内容に置き換えられます。または、文字列に追加する追加の印刷可能な文字がないため、引用符を完全に削除し、変数のみを使用します。

$valsx = array( $country,  
                $stateProvince,
                $city3,
                $city3Geocode,
                $monthlyRental
         );

編集:

ちなみに、非推奨のmysql関数の代わりにPDOを使用することを学ぶことは間違いなく価値があります。あなたがそれらのためにグーグルするならば、周りにいくつかの良いチュートリアルがあります。

于 2012-07-10T19:52:59.483 に答える
1

値を引用符で囲む必要があります。そうでない場合、SQLは値をフィールド名として解釈します。

INSERT INTO table (field) VALUES (country)

country;という列を探します。一方

INSERT INTO table (field) VALUES ('country')

文字列を追加しますcountry

SQLに障害が発生した場合は、何が生成されているかを確認するために印刷し、それをデータベースで直接実行して、実際に機能することを確認することをお勧めします。エラーメッセージも表示されます。

于 2012-07-10T19:51:07.707 に答える
1

私はこれが好きです:

$colsx = array('country', 'stateProvince', 'city3', 'city3Geocode', 'monthlyRental');
// List of optional fields
$colsy = array('otherfield', 'other2', ...);

// Building the query
$fields = array();
$values = array();

// Mandatory fields
foreach($colsx as $col)
{
    if (!isset($_POST[$col]))
        die("MISSING field $col";
    $fields[] = $col;
    if (is_numeric($_POST[$col]))
        $values[] = mysql_real_escape_string($_POST[$col]);
    else
        $values[] = "'".mysql_real_escape_string($_POST[$col])."'";
}

// Optional fields
foreach($colsy as $col)
{
    //if (!isset($_POST[$col]))
    //    die("MISSING field $col";
    $fields[] = $col;
    if (is_numeric($_POST[$col]))
        $values[] = mysql_real_escape_string($_POST[$col]);
    else
        $values[] = "'".mysql_real_escape_string($_POST[$col])."'";
}

$fields_sql = implode(',', $fields);
$values_sql = implode(',', $values);

$query = "INSERT INTO `$table` ($fields_sql) VALUES ($values_sql);"

検証済みのフィールドがすでにある場合は、この方法で実行できます(ただし、誰かが提案しているように、mysql_関数の代わりにPDOを使用する方がよいでしょう。後でこれを実行することを検討してください)。

$data = array(
    // FIELD            VALUE ("$country" and $country are the same thing)
    'country'        => $country,
    'stateProvince'  => $stateProvince,
    'city3'          => $city3,
    ...
);

// If you need to add a field conditionally, you do it like this:
// if (isset($_POST['newfield']))
//     $data['newfield'] = $_POST['newfield'];
// or also, maybe:
//
// if (isset($_POST['newfield']) && !empty($_POST['newfield']))
//     $data['newfield'] = $_POST['newfield'];

// Process the values in $data to get SQL fields (PDO does this by itself)

$values = array();
foreach($data as $field => $value)
{
    if (is_numeric($value))
        $values[] = $value;
    else
        $values[] = "'".mysql_real_escape_string($value)."'";
}
// Now we have all we need. The "fields" are $data's keys.
$fields_sql = implode(',', array_keys($data));
$values_sql = implode(',', $values);

$query = "INSERT INTO `$table` ($fields_sql) VALUES ($values_sql);";

PDOを使用した場合も同じです。

$data = array(
    // FIELD            VALUE ("$country" and $country are the same thing)
    'country'        => $country,
    'stateProvince'  => $stateProvince,
    'city3'          => $city3,
    ...
);

// Process $data to get SQL fields (we could use array_fill)
$values = array();
foreach($data as $field => $value)
    $values[] = '?'; // Placeholder, without quotes

$fields_pdo = implode(',', array_keys($data));
$values_pdo = implode(',', $data);

// This is now INSERT INTO mytable (city,rent,...) VALUES (?,?,?,...);
$query = "INSERT INTO $table ($fields_sql) VALUES ($values_sql);";

$q = $conn->prepare($query);
$q->execute(array_values($data));
于 2012-07-10T19:58:44.977 に答える