[英]Array keys as mysql column names for insert?
我正在使用將搜索結果作為json返回的API。 然后,我需要將其寫入MYSQL表。 我之前已經成功完成了此操作,但是這次情況有所不同,我認為這是由於結果數組的結構所致:鍵名是動態的,因為如果某個鍵的數據不存在,則鍵名就不會在數組中列出。 這是數組的示例vardump:
array
0 =>
array
'title' => string 'Funny but not funny' (length=19)
'body' => string 'by Daniel Doi-yesterday while eating at Curry House...
'url' => string 'http://danieldoi.com/2012/11/20/funny-but-not-funny/'
'source_site_name' => string 'WordPress.com' (length=13)
'source_site_url' => string 'http://www.wordpress.com' (length=24)
'query_topic' => string 'thanksgiving' (length=12)
'query_string' => string 'blogs=on&topic=thanksgiving&output=json' (length=39)
1 =>
array
'title' => string 'Travel Easy this Holiday Season...' (length=34)
'body' => string 'Give yourself a few gifts and get this holiday season off...
'url' => string 'http://facadebeauty.wordpress.com/2012/11/20
'date_published' => string 'Tue, 20 Nov 2012 18:22:35 +0000' (length=31)
'date_published_stamp' => string '1353435755' (length=10)
請注意,鍵的順序/包含如何更改。
我提出的解決方案是將數組鍵用作列名,將它們轉換為變量以在查詢語句中使用,但這對我不起作用。 這是我的嘗試:
$jsonString = file_get_contents("http://search-query-URL&output=json");
$array = json_decode($jsonString, true);
// database connection code snipped out here
$table = "results";
foreach($array as $arr_value) {
foreach ($arr_value as $value) {
$colName = key($arr_value);
$colValue = ($value);
$insert="INSERT INTO $table ($colName) VALUES ('$colValue')";
mysql_query($insert) OR die(mysql_error());
next($arr_value);
}
}
關於下一步的建議? 謝謝!
更新11/27:
在這里,我試圖適應戴維的建議。 我收到以下錯誤:“數據庫連接錯誤(1110)在查詢中指定了兩次列'title'。
這是我現在的代碼:
$mysqli = mysqli_connect("localhost");
mysqli_select_db($mysqli, "mydatabase");
foreach ($array as $column) {
foreach ($column as $key => $value) {
$cols[] = $key;
$vals[] = mysqli_real_escape_string($mysqli, $value);
}
}
$colnames = "`".implode("`, `", $cols)."`";
$colvals = "'".implode("', '", $vals)."'";
$mysql = mysqli_query($mysqli, "INSERT INTO $table ($colnames) VALUES ($colvals)") or die('Database Connection Error ('.mysqli_errno($mysqli).') '.mysqli_error($mysqli). " on query: INSERT INTO $table ($colnames) VALUES ($colvals)");
mysqli_close($mysqli);
if ($mysql)
return TRUE;
else return FALSE;
最終更新-工作!
工作正常 這是我們得到的:
$mysqli = mysqli_connect("localhost");
mysqli_select_db($mysqli, "mydatabase");
foreach ($array as $column) {
foreach ($column as $key => $value) {
$cols[] = $key;
$vals[] = mysqli_real_escape_string($mysqli, $value);
}
$colnames = "`".implode("`, `", $cols)."`";
$colvals = "'".implode("', '", $vals)."'";
$mysql = mysqli_query($mysqli, "INSERT INTO $table ($colnames) VALUES ($colvals)") or die('Database Connection Error ('.mysqli_errno($mysqli).') '.mysqli_error($mysqli). " on query: INSERT INTO $table ($colnames) VALUES ($colvals)");
unset($cols, $vals);
}
mysqli_close($mysqli);
if ($mysql)
return TRUE;
else return FALSE;
實際上,我只是一直使用此功能,因為我一直都在使用它。 這是做什么的:將數組中的所有關聯對合並以插入表中,然后將它們作為單個插入插入。 需要明確的是:這不是您在上面所做的,因為您似乎正在嘗試將每個值插入其自己的插入內容中,這可能會使您獲得比您想要的更多的行。
function mysqli_insert($table, $assoc) {
$mysqli = mysqli_connect(PUT YOUR DB CREDENTIALS HERE);
mysqli_select_db($mysqli, DATABASE NAME HERE);
foreach ($assoc as $column => $value) {
$cols[] = $column;
$vals[] = mysqli_real_escape_string($mysqli, $value);
}
$colnames = "`".implode("`, `", $cols)."`";
$colvals = "'".implode("', '", $vals)."'";
$mysql = mysqli_query($mysqli, "INSERT INTO $table ($colnames) VALUES ($colvals)") or die('Database Connection Error ('.mysqli_errno($mysqli).') '.mysqli_error($mysqli). " on query: INSERT INTO $table ($colnames) VALUES ($colvals)");
mysqli_close($mysqli);
if ($mysql)
return TRUE;
else return FALSE;
}
如上文MarcB所述,存在目標表中沒有顯示結果列的風險。 但是我們正在使用mysqli_real_escape_string
插入操作,因此注入漏洞不會出現問題。
這里是一線:
$query = 'INSERT INTO '.$table.'(`'.implode('`, `', array_keys($array)).'`) VALUES("'.implode('", "', $array).'")';
我注意到上面已經發布了一個答案,但是由於我已經寫了這個答案,以為我會發布它。 注意:希望您信任從何處獲取數據,否則會引發各種問題。 我還在整個代碼中添加了注釋,希望有助於理解它是如何完成的。
$jsonString = file_get_contents("http://search-query-URL&output=json");
$array = json_decode($jsonString, true);
// database connection code snipped out here
$table = "results";
foreach($array as $sub_array) {
// First, grab all keys and values in separate arrays
$array_keys = array_keys($sub_array);
$array_values = array_values($sub_array);
// Build a list of keys which we'll insert as string in the sql query
$sql_key_list = array();
foreach ($array_keys as $key){
$sql_key_list[] = "`$key`";
}
$sql_key_list = implode(',', $sql_key_list);
// Build a list of values which we'll insert as string in the sql query
$sql_value_list = array();
foreach ($array_values as $value){
$value = mysql_real_escape_string($value);
$sql_value_list[] = "'$value'";
}
$sql_value_list = implode(',', $sql_value_list);
// Build the query
$insert = "INSERT INTO $table ($sql_key_list) VALUES ($sql_value_list)";
mysql_query($insert) or die(mysql_error());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.