我必须从 PHP 存储到 MySQL 中很多;通常要存储的内容我有数组。因此,我编写了一小部分帮助函数,为我节省了大量时间。
store
这是存储$array
到 MySQL中的主要函数$table
:
function store($array, $table, $limit = 1000, $mode = '') {
if (empty($array)) return FALSE;
$sql_insert = "INSERT INTO `".$table."` (";
$array_keys = array_keys($array);
$keys = array_keys($array[$array_keys[0]]);
foreach ($keys as $key) $sql_insert .= "`".$key."`,";
$sql_insert = replaceEND($sql_insert, ') VALUES ', 1);
$count = 1;
$sql = $sql_insert;
foreach ($array as $array_num => $row) {
$sql .= '(';
foreach ($row as $key => $value) {
$string = $value;
if (!is_null($value)) {
$sql .= "'".str_replace("'", "\'", $string)."',";
} else {
$sql .= "NULL,";
}
}
$sql = replaceEND($sql, '),', 1);
$count = checkInsert($sql, $count, $limit);
if ($count == 0) {
if ($mode == 'PRINT') echo $sql.'<br />';
$sql = $sql_insert;
}
$count++;
}
$last = lastInsert($sql);
if ($last) {
if ($mode == 'PRINT') echo $sql.'<br />';
}
return TRUE;
}
我在这个函数中使用了以下助手 -
为语句字符串添加正确的结尾:
function replaceEnd($string, $replacer = ';', $number_of_chars = 1) {
return left($string, strlen($string) - $number_of_chars) . $replacer;
}
要检查,如果$limit
达到这将导致语句的执行:
function checkInsert($sql, $sqlcount, $sql_limit) {
if ($sqlcount >= $sql_limit) {
$sql = replaceEND($sql);
query($sql);
$sqlcount = 0;
}
return $sqlcount;
}
要在循环完成后检查最后一个插入:
function lastInsert($sql, $sql_insert = '') {
if (right($sql, 1) != ';') {
if ($sql != $sql_insert) {
$sql = replaceEND($sql);
query($sql);
return TRUE;
}
}
return FALSE;
}
最后,执行我的语句:
function query($sql) {
$result = mysql_query($sql);
if ($result === FALSE) {
## Error Logging
}
return $result;
}
基本上,这些功能没有任何问题。但是有一个问题,我无法解决:如您所见,$limit
默认设置为 1000。这通常很好,但是当涉及到每行插入语句有很多内容/很多字符的插入语句时,我必须$limit
手动减少以避免错误。我的问题:有没有人知道一种方法来自动检查当前插入语句是否已达到最大值以便正确执行而不会因为过早执行而浪费时间?这将同时解决两个问题: 1. 我可以摆脱$limit
2. 将数组存储到 MySQL 所需的执行时间最小化。我只是没有找到任何方法来检查代表 MySQL 插入语句的字符串的最大可能长度,我可以在执行语句之前应用它......!?