Я столкнулся с какой-то странной проблемой в своем программировании на PHP. Используя функцию backtrace
для получения последнего файла, с которым работал компилятор PHP. Это даст мне путь, используя обратную косую черту. Я хотел сохранить эту строку в базе данных, но MySQL удалит их; Я предполагаю, что думал, что я хочу сбежать от них.
Таким образом, C:\Path\To\Filename.php
закончит C:PathToFileName.php
в базе данных. Когда я отправил этот вопрос в Google, я нашел много других с той же проблемой, но во многих разных ситуациях. Люди всегда предлагали что-то вроде:
$str = '\dada\dadda'; var_dump(str_replace('\', '\\', $str));
Проблемы с этим, даже если вы помещаете его в какую-то петлю, заключается в том, что вы просто заменяете первый \
на \\
. Итак, он начинается с \
then \\\
then \\\\\
then \\\\\
then \\\\\
т. Д. … Пока он не заполнит буфер памяти этой огромной строкой.
Мое решение этой проблемы, если у кого-то еще есть:
//$file = C:\Path\To\Filename.php //Need to use \\ so it ends up being \ $fileArray = explode("\\", $file); //take the first one off the array $file = array_shift($fileArray); //go thru the rest of the array and add \\\\ then the next folder foreach($fileArray as $folder){ $file .= "\\\\" . $folder; } echo $file //This will give you C:\\Path\\To\\Filename.php
Поэтому, когда он хранится в базе данных, он будет выглядеть как C:\Path\To\Filename.php
.
Если у кого-то еще есть лучшее решение, я все уши.
Вам нужно «удвоить escape» их внутри параметров preg_replace
(один раз для строки, один раз для механизма regex):
$mystring = 'c:\windows\system32\drivers\etc\hosts'; $escaped = preg_replace('/\\\\/','\\\\\\\\',$mystring); echo "New string is: $escaped\n";
Или только один раз, если вы используете str_replace
:
$newstring = str_replace('\\','\\\\',$mystring); echo "str_replace : $newstring\n"; ?>
mysql_real_escape_string('C:\Path\To\Filename.php');