Здравствуйте! Я работаю над админкой, которая по запросу создает новый PHP файл и передает в него информацию. Как можно передать переменную, если требуется использовать одинарные кавычки (''), но также необходимо обернуть переменную в одинарные кавычки? <br/> <br/> <pre><code class="php">$myfile = fopen("../news/$latin.php", "w") or die("Unable to open file!");
$txt =
'<?php
$db = new PDO(dsn:"mysql:host=localhost;dbname=BorkiFestival_site", username:"root", password: "root");
$info = [];
$str = pathinfo(__FILE__, PATHINFO_FILENAME); // осторожно! необходима экранизация
if($query = $db->query("SELECT * FROM `news_cards` WHERE name_src LIKE ' $str'")){
$info = $query->fetchAll(fetch_style: PDO::FETCH_ASSOC);
}else{
print_r($db->ErrorInfo());
}
foreach($info as $data):?>'
fwrite($myfile, $txt);
fclose($myfile);</code></pre>
Чтобы передать переменную и обернуть её в одинарные кавычки в PHP, вы можете использовать двойные кавычки для всего текста, а внутри них использовать одинарные кавычки, когда это необходимо. В таком случае вы сможете без проблем вставлять переменные PHP.
Вот как можно это сделать в вашем примере:
```php
$myfile = fopen("../news/$latin.php", "w") or die("Unable to open file!");
$txt = "<?php
\$db = new PDO('mysql:host=localhost;dbname=BorkiFestival_site', 'root', 'root');
\$info = [];
\$str = pathinfo(__FILE__, PATHINFO_FILENAME); // осторожно! необходима экранизация
if(\$query = \$db->query(\"SELECT * FROM `news_cards` WHERE name_src LIKE '$str'\")){
\$info = \$query->fetchAll(PDO::FETCH_ASSOC);
} else {
print_r(\$db->ErrorInfo());
}
foreach(\$info as \$data):
?>";
fwrite($myfile, $txt);
fclose($myfile);
```
Обратите внимание на следующие моменты:
1. Я использовал двойные кавычки для строки `$txt`, чтобы вставить переменные, такие как `$str`, передавая их значение.
2. Внутри строки я использовал экранирование символа `$` с помощью обратной косой черты `\`, чтобы PHP не интерпретировал его как начало переменной, если она не должна быть подставлена в ходе выполнения. Так как это будет записано в файл, мы экранируем всё, кроме частей, где мы хотим, чтобы переменные были интерпретированы.
3. Также я использовал одинарные кавычки для параметров PDO, чтобы избежать конфликтов с двойными кавычками.
Этим образом вы сможете создать файл с нужным вам PHP-кодом, в котором будет использоваться переменная и при этом корректно оформлены кавычки.
Перед кавычкой ставить обратный слэш <br/> <pre><code class="php">if($query = $db->query("SELECT * FROM \`news_cards\` WHERE name_src LIKE \`$str\'")){</code></pre>
Первый вариант: использовать ' вместо ". <br/> Второй вариант: экранирование.
Способов сделать это -- великое множество, но возникает вопрос, "ЗАЧЕМ?" <br/> <br/> Как говаривал классик, "не нужна тебе такая админка, брат". Способ вредный, нерациональный, неудобный. <br/> <br/> Вам нужно создать ОДИН файл, например news.php в котором будет только тот код, который вы экранируете. <br/> <br/> И затем, просто подставлять в SQL запрос вашу переменную $str с уникальным slug новости. <br/> В браузере будет выглядеть так: <br/> site.ru/news.php?slug=pervomai <br/> <br/> В php-скрипте получаете slug 'pervomai' (как и любые другие параметры адресной строки) через массив $_GET; <br/> А именно <br/> <br/> <code class="php">$str = $_GET['slug'];</code> <br/> <br/> В SQL пишете примерно <br/> <br/> <code class="sql">SELECT ...... WHERE name_src LIKE '$_GET["slug"]'</code> <br/> <br/> В итоге: один файл и хоть тысячу новостей через него можно посмотреть. <br/> <br/> P.S Все, что получается из массива $_GET, нужно экранировать и обрабатывать, дабы не подставиться под SQL-инъекцию. Загуглите потом "prepared statements в PDO"
sprintf
Можно обернуть в функцию, а требуемую переменную дать аргументом
Используйте prepared statements. И пересмотрите архитектуру, генерировать код нужно только для очень специфичных задач, и уж точно не для того, чтобы "показать новости". Посмотрите на свой код, вы там ничего не генерируете, у вас статичный код и просто меняются данные.