2015-11-23 3 views
2

Когда я использую array_map('mysql_real_escape_string', $row), $row может нормально использовать и использовать его после того, как он возвращает пустое значение, я видел ту же проблему, но все же могу не решить, вот мой код:

$result = $db->query("SELECT * FROM `{$table}` LIMIT {$start}, 1000"); 
foreach ($result as $row) { 
    $row = array_map('mysql_real_escape_string', $row); 
    $sql = "INSERT INTO `{$table}` VALUES ('" . implode("', '", $row) . "');\n"; 
} 
+0

(1) Вы действительно просто вставляете обратно в тот же стол? (2) вы ничего не делаете с '$ sql'. (3) ли '$ db-> query()' возвращает результат? обычно вам нужно сделать '-> fetch()' – Sean

+0

(1), да, та же таблица. (2) Мне нужен print sql, вы можете думать, что это $ sql => $ str, (3) $ db-> query() возвращает двоичный массив, затем используйте foreach traverse it @Sean –

+0

- это '$ db' соединение' mysql' (или 'mysqli')? – Sean

ответ

0

PHP/mysql alwyas возвращает значения как строки. Это означает, что ваш вызов mysql_real_escape_string всегда будет пытаться избежать строкового значения.

0

Мне кажется, что вы используете mysqli для подключения к базе данных и старой функции mysql_real_escape_string(), чтобы избежать ваших значений. Поскольку mysql_real_escape_string имеет 2 параметра, и вы не можете передать 2 параметра функции с помощью функции array_map, второй параметр ($dblink) пытается использовать его значение по умолчанию (последнее открытое соединение mysql или нет открытого подключения, которое он пытается открыть, используя расширение). Поскольку у вас нет открытых подключений и, скорее всего, нет соединений, определенных в вашем открытии конфигурации, новое соединение не будет работать через старый API.

Вместо этого используйте вместо этого mysqli_real_escape_string().

$row = array_map(array($db, 'real_escape_string'), $row); 

(Если вы не используете Mysqli расширение, но старый MySQL, это подходящее время, чтобы изменить на новый, так как старый расширение MySQL является устаревшим)

О запросах: Вы используете лимит без предложения ORDER BY. В MySQL нет стандартного заказа, поэтому строки, возвращаемые вашим запросом выбора, не определены.

Кроме того, вы можете сделать эту операцию в одном запросе с помощью INSERT..SELECT синтаксиса:

INSERT INTO {table} 
SELECT * FROM {table} ORDER BY {order_field} LIMIT 1000 

Примечания: это всегда хорошая практика, чтобы не использовать астронома запросов (звезда для астрономов), но список все колонны.

+0

my db link использует mysqli connect, я пытаюсь использовать '$ row = array_map (array ($ db,' real_escape_string '), $ row); вместо этого и вернуть пустой массив, ключ и значение не существует. Моя конечная цель - сделать резервную копию базы данных, как только каждая тысяча займет. –

+0

Любые сообщения об ошибках? Вы пытались отлаживать ваш запрос/код по очереди? Что ты нашел? Основная проблема вашего исходного кода заключается в том, что библиотеки баз данных различны. Пробовал ли вы последний запрос, который выполняет задание за один шаг без повторения записей? – Pred