Я использую регулярные выражения для достижения этого. Во-первых, я динамически строю регулярное выражение.
string regex = string.Format ("[{0}]", Regex.Escape (новая строка (Path.GetInvalidFileNameChars ()))); Regex removeInvalidChars = new Regex (regex, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.CultureInvariant);
Затем я просто вызываю removeInvalidChars.Replace, чтобы найти и заменить. Это, очевидно, может быть расширено и для покрытия дорожек.
У вас не может быть двух одновременных запросов, потому что mysqli по умолчанию использует небуферизованные запросы (для подготовленных операторов, для vanilla mysql_query
). Вы можете либо перенести первый в массив и пропустить его, либо сообщить mysqli для буферизации запросов (используя $stmt->store_result()
).
См. здесь для деталей.
Для тех, что предыдущие ответы не помогли ... вот что было МОЙ ПРОБЛЕМ !!!
привязка param была «динамической», поэтому у меня была переменная, которая задает параметры данных для использования bind_param. Так что переменная была неправильной, но вместо того, чтобы бросать ошибку, например, «неверные данные параметров», она говорит «вне синхронизации bla bla bla», поэтому я был смущен ...
Надеюсь, это помогло кому-то!
Я использую CodeIgniter. Один сервер OK ... этот, вероятно, старше ... В любом случае использование
$this->db->reconnect();
Исправлено.
Я вызываю эту функцию каждый раз перед использованием $ mysqli-> query. Работает с хранимыми процедурами.
function clearStoredResults(){
global $mysqli;
do {
if ($res = $mysqli->store_result()) {
$res->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
, чтобы решить эту проблему, вы должны хранить данные результата перед ее использованием
$numRecords->execute();
$numRecords->store_result();
, это все
У меня была такая же проблема, но только при работе с хранимой процедурой. Это заставляет запрос вести себя как многопроцессорный запрос, поэтому вам нужно «использовать» другие результаты, чтобы сделать другой запрос.
while($this->mysql->more_results()){
$this->mysql->next_result();
$this->mysql->use_result();
}
Это не связано с исходным вопросом, но у меня было такое же сообщение об ошибке, и этот поток стал первым хитом в Google, и мне потребовалось некоторое время, чтобы выяснить, в чем проблема, поэтому он может быть полезен для другие:
Я НЕ использую mysqli, все еще используя mysql_connect. У меня были некоторые простые запросы, но один запрос заставил все остальные запросы сбой в одном и том же соединении.
Я использую mysql 5.7 и php 5.6 у меня была таблица с типом данных «JSON». очевидно, моя php-версия не распознала возвращаемое значение из mysql (php просто не знал, что делать с JSON-Format, потому что встроенный mysql-модуль был слишком старым (по крайней мере, я думаю))
на данный момент я изменил тип JSON-Field-Type на Text (так как теперь мне не нужна собственная функция mysql JSON), и все работает отлично
Проверьте правильность ввода всех параметров. Он выдает ту же ошибку, если количество параметров, определенных и переданных функции, различно.
Я думаю, проблема в том, что вы создаете новое соединение в функции, а затем не закрываете ее в конце. Почему бы вам не попробовать перейти к существующему соединению и повторно использовать его?
Другая возможность заключается в том, что вы возвращаетесь из середины цикла. Вы никогда не завершаете эту внешнюю выборку.
Если вы используете либо буферный, либо небуферизованный результирующий набор для извлечения данных, сначала вы должны просто очистить извлеченные данные из памяти, после того, как вы извлекли все данные . Поскольку вы не можете выполнить другую процедуру MYSQL в том же соединении, пока вы не очистите извлеченную память. Добавьте эту функцию ниже справа от своего скрипта, чтобы решить проблему
$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch
Проблема заключается в библиотеке клиента MySQL MySQL, на которой построено большинство MySQL API. Проблема в том, что библиотека C не поддерживает одновременное выполнение запросов, поэтому все API, построенные поверх этого, также нет. Даже если вы используете небуферизованные запросы. Это одна из причин, по которой был написан асинхронный API MySQL. Он напрямую связывается с сервером MySQL с использованием TCP, а проводной протокол поддерживает одновременные запросы .
Ваше решение состоит в том, чтобы либо модифицировать алгоритм, так что вам не нужно иметь оба или же изменить их на использование буферизованных запросов, что, вероятно, является одной из исходных причин их существования в библиотеке C (другое - предоставить своего рода курсор).
Я решил эту проблему в своем приложении C - вот как я это сделал:
mysql_store_result()
], я перебираю любые дальнейшие потенциально ожидающие результаты, возникающие при выполнении нескольких операторов SQL, таких как два или более оператора select (назад назад, не имея дело с результатами). Дело в том, что мои процедуры не возвращают несколько результатов, но база данных не знает, что до выполнения: [C API: mysql_next_result()
]. Я делаю это в цикле (для хорошей меры), пока не вернет ненулевое значение. Вот когда текущий обработчик подключений знает, что можно выполнить другой запрос (я кэширую свои обработчики, чтобы минимизировать накладные расходы на соединение). Это цикл, который я использую: for(; mysql_next_result(mysql_handler) == 0;)
/* do nothing */;
Я не знаю PHP, но я уверен, что у него что-то похожее.
$stmt->store_result();
. Думаю, ваш ответ должен сделать это более ясным. – Shadow 14 March 2013 в 09:24$select_stmt->close();
, чтобы разделить их (не одновременно, а процедурно – n34_panda 7 June 2014 в 12:13