2017-06-02 39 views
1

我一直在試圖將一些數據輸入到我的SQLI數據庫使用PHP ..如何以正確的格式獲取此查詢?

在插入查詢,尋找,當我做到這一點通過GUI上的phpMyAdmin的變量需要被包裹在單引號..

這是我如何建立查詢至今:

$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)準備帶有綁定參數的語句,如[**這篇文章**]所述(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

我可以發現至少兩個錯誤。

  • 查詢缺乏字串,單引號
  • 混合的API(mysql_mysqli_不混合),你用mysql_real_escape_string()

兩個錯誤是由使用的MySQLi準備語句固定。這不是一個非常複雜的查詢,也可能是靜態編寫的,但是如果你想像這樣動態編寫它,這不是一個問題 - 如果你使用PHP 5.6,你可以使用array拆包...) 。要生成佔位符?,我們創建一個數組,其中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));

Ouch。不好。

榮譽試圖逃避內容,但如果數據中包含逗號,則會使用此代碼取消粘貼。

你已經有了一個很好的泛型方法的開頭插入數據,可以考慮:

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); 
}