1

これが私の配列です:

$person = array(
    "fullname" => $fn,
    "skin_shade" => $_POST['skin_shade'],
    "acne" => $_POST['acne'],
    "dry_skin" => $_POST['dry_skin'],
    "oily_skin" => $_POST['oily_skin'],
    "wrinkles_aging" => $_POST['wrinkles_aging'],
    "sensative_skin" => $_POST['sensative_skin'],
    "darkspots" => $_POST['darkspots'],
    "hair_type" => $_POST['hair_type'],
    "parabens" => $_POST['parabens'],
    "sulfates" => $_POST['sulfates'],
    "mineral_oil" => $_POST['mineral_oil'],
    "silicones" => $_POST['silicones'],
    "relaxed" => $_POST['relaxed'],
    "colortreated" => $_POST['colortreated'],
    "thinning" => $_POST['thinning'],
    "growth" => $_POST['growth'],
    "braidout" => $_POST['braidout'],
    "roller" => $_POST['roller'],
    "wng" => $_POST['wng'],
    "heat" => $_POST['heat'],
    "wig" => $_POST['wig'],
    "braid" => $_POST['braid'],
    "dreadlocks" => $_POST['dreadlocks'],
    "henna" => $_POST['henna'],
    "hair_color" => $_POST['hair_color'],
    "hair_style" => $_POST['hair_style'],
);

そして、ここに挿入しようとしてエラーが発生します:

$columns = implode(", ",array_keys($person));
$escaped_values = array_map('mysql_real_escape_string', array_values($person));
$values = implode(", ", $escaped_values);
$sql = "INSERT INTO people ($columns) VALUES ('$values')";
mysql_query($sql) or die (mysql_error());

また、列と値に print_r を使用して、それらが同じサイズであることを確認しました。

print_r($columns); echo"</br></br>";
print_r($values);

そのために得られる出力は次のとおりです。

フルネーム、skin_shade、にきび、dry_skin、oily_skin、しわ_老化、敏感肌、darkspots、hair_type、パラベン、硫酸塩、mineral_oil、シリコーン、リラックス、カラートリートメント、間伐、成長、三つ編み、ローラー、ウィング、熱、かつら、三つ編み、ドレッドヘア、ヘナ、 hair_color、hair_style

Chris Runo, 2, いいえ, はい, いいえ, はい, はい, いいえ, ストレート, いいえ, いいえ, いいえ, いいえ, いいえ, いいえ, はい, いいえ, いいえ, いいえ, いいえ, いいえ, いいえ, いいえ、ダークブラウン、クラシック

また、MySQL テーブルを確認したところ、27 列ありました。

4

2 に答える 2

5
$sql = "INSERT INTO people ($columns) VALUES ('$values')";

これは、1 つの文字列リテラルを VALUES 句に入れます。単一引用符で囲まれた文字列には、コンマで区切られた値のリストが含まれます。

INSERT INTO people (...columns...) VALUES ('Chris Runo, 2, No, Yes, No, Yes, Yes, No, Straight, No, No, No, No, No, No, No, Yes, No, No, No, No, No, No, No, No, dark_brown, classic')

これを解決するには、独自の引用符/エスケープ関数を作成し、それを array_map() で使用できます。

function myquote($val)
{
  return "'" . mysql_real_escape_string($val) . "'";
}

$escaped_values = array_map('myquote', array_values($person));

$values = implode(", ", $escaped_values);
$sql = "INSERT INTO people ($columns) VALUES ($values)";

または、非推奨の mysql_* 関数を放棄して PDO を使用することもできます。これにより、SQL インジェクションから安全なクエリをより簡単に作成できます。

$columns = implode(", ",array_keys($person));
$params = implode(",", array_fill(0, count($person), "?"));

$sql = "INSERT INTO people ($columns) VALUES ($params)";
$stmt = $pdo->prepare($sql) or die(print_r($pdo->errorInfo(), true));
$stmt->execute(array_values($people)) or die(print_r($stmt->errorInfo(), true));
于 2013-02-19T01:25:38.650 に答える
0

値を で区切る必要があります''。したがって、内破を次のように変更します。

$values = implode("', '", $escaped_values);
于 2013-02-19T01:27:53.140 に答える