2017-06-02 20 views
1

私はこのクエリを正しい形式で取得するにはどうすればよいですか?

は、私がPHPMyAdminの上のGUIでそれを行う際の変数は単一引用符で囲まする必要がINSERTクエリを見てみると... PHPを使用して、私のSQLIデータベースに入力するいくつかのデータを取得しようとしてきた。..

これは私がこれまでにクエリを構築しています方法です:

$fields = array('`appName`' => $_POST[appName], 
        '`appDescription`' => $_POST[appDescription], 
        '`UploadDate`' => date("Y-m-d"), 
        '`appWebsite`' => $_POST[appWebsite]); 
printarray($fields); 

print "<br>"; 
print "<br>"; 

$columns = implode(", ",array_keys($fields)); 
$escaped_values = array_map('mysql_real_escape_string', array_values($fields)); 
$values = implode(", ", $escaped_values); 

$sql = "INSERT INTO `applist`.`apps` ($columns) VALUES ($values)"; 

print $sql; 
print "<br>"; 

if (mysqli_query($conn, $sql)) { 
    echo "New record created successfully"; 
} else { 
    echo "Error"; 
} 

これは私にそうようなクエリを与えます。..どうすればよい

INSERT INTO `applist`.`apps` (`appName`, `appDescription`, `UploadDate`, `appWebsite`) 
VALUES (SDD, DDD, 2017-06-02, DDDD) 

配列の値を一重引用符で囲みます。

助けてください。

+2

は、文字列の連結でクエリを作成しないでください。 [** mysqli **](https://secure.php.net/manual/en/mysqli.prepare.php)または[** PDO **](https://secure.php.net/manual/)を使用してください。 en/pdo.prepared-statements.php)は、[** this post **](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection)で説明されているように、バインドされたパラメータを持つプリペアドステートメント-in-php)。 –

+0

ここでAPIを混在させると動作しません。クエリは、それを動的に構築するために必要なものではありません。もちろん、準備されたステートメントで構築することはできますが、少なくとも構築することはできます。 – Qirel

答えて

0

あなたはそれを引用符を追加して、SQLクエリで開始と終了引用符を追加できるように、内破使用しているので:

$fields = array('`appName`' => $_POST[appName], 
        '`appDescription`' => $_POST[appDescription], 
        '`UploadDate`' => date("Y-m-d"), 
        '`appWebsite`' => $_POST[appWebsite]); 
printarray($fields); 

print "<br>"; 
print "<br>"; 

$columns = implode(", ",array_keys($fields)); 
$escaped_values = array_map('mysql_real_escape_string', array_values($fields)); 
$values = implode("', '", $escaped_values); //add qoutes 

$sql = "INSERT INTO `applist`.`apps` ($columns) VALUES ('$values')"; //add start and end qoutes 

print $sql; 
print "<br>"; 

if (mysqli_query($conn, $sql)) { 
    echo "New record created successfully"; 
} else { 
    echo "Error"; 
} 

しかし、それは良い解決策ではないと多分エラーが他のクエリのために発生しました!使用PDOはそれより優れています!

0

各配列値に一重引用符を追加する必要があります。

は、あなたも二重引用符を追加

$values = "'" . implode ("', '", $escaped_values) . "'"; 

$values = implode(", ", $escaped_values); 

を交換してください。

1

少なくとも2つのエラーがあります。クエリで文字列を囲む単一引用符を欠く

  • ミキシングAPIは(mysql_mysqli_が混在しない)、あなたはどちらのエラーはMySQLiのでプリペアドステートメントを使用して固定されているmysql_real_escape_string()

使用しています。これは非常に複雑なクエリではなく、静的に記述することもできますが、動的にこのように記述したい場合は問題ありません。PHP 5.6の場合は、の配列展開...) 。プレースホルダー?を生成するには、count($fields)要素数の配列を作成します。すべてが?の値です。これはarray_fill()で行われます。それから、私たちが列でしたように、implode()それを適所に入れます。

$fields = array('`appName`' => $_POST['appName'], 
       '`appDescription`' => $_POST['appDescription'], 
       '`UploadDate`' => date("Y-m-d"), 
       '`appWebsite`' => $_POST['appWebsite']); 
$columns = implode(", ",array_keys($fields)); 

$sql = "INSERT INTO `applist`.`apps` ($columns) VALUES (".implode(", ", array_fill(0, count($fields), '?')).")"; 

if ($stmt = $conn->prepare($sql)) { 
    $stmt->bind_param(str_repeat("s", count($fields)), ...$fields); 
    if ($stmt->execute()) 
     echo "New record created successfully"; 
    else 
     echo "Insert failed"; 
    $stmt->close(); 
} else { 
    echo "Error"; 
} 

これは、文字列の引用を処理し、SQLインジェクションを防止します。

遭遇する可能性のあるエラーを取得するには、mysqli_error($conn)および/またはmysqli_stmt_error($stmt)を使用してください。これは間違って何が起こったかを正確に伝えます。

また、POST配列からインデックスを引用する必要があります。 PHPはそれを把握し、appName'appName'に変換しますが、エラーをログに記録する場合は注意が必要です。

0

$列=破( ""、array_keys($フィールド))。 $ escaped_values = array_map( 'mysql_real_escape_string'、array_values($ fields));

大です。良くない。

誇りをもってコンテンツをエスケープしようとしていますが、データにカンマが含まれている場合は、このコードを使用して元に戻ります。

あなたはデータを挿入するための素敵なジェネリックメソッドの始まりを持って、考えてみます。

function insert($db_conn, $table, $data) 
{ 
    $ins_vals=array(); // note we write the transformed data to a new array 
     // as we may be modifying the column names too 
    foreach ($data as $key=>$val) { 
     // we need to protect the column names from injection attacks as 
     // well as the data hence: 
     $quoted_key="`" . str_replace("`", "", $key) . "`"; 

     // next we create an appropriate representation of the data value 
     if (is_null($val)) { 
      $ins_vals[$quoted_key]="NULL"; // in SQL 'NULL' != NULL 
     } else if (is_numeric($val)) { 
      // nothing to change here 
      $ins_vals[$quoted_key]=$val; // no need to quote/escape 
     } else { 
      $ins_vals[$quoted_key]="'" 
       . mysqli_real_escape_string($dbconn, $val) 
       . "'"; 
     } 
    } 
    // then we stick the bits together in an SQL statement 
    $cols=implode(",", array_keys($ins_vals)); 
    $vals=implode(",", $ins_vals); 
    $sql="INSERT INTO $table ($cols) VALUES ($vals)"; 
    return mysqli_query($dbconn, $sql); 
} 
関連する問題