Как можно передать переменную?

Здравствуйте! Я работаю над админкой, которая по запросу создает новый PHP файл и передает в него информацию. Как можно передать переменную, если требуется использовать одинарные кавычки (''), но также необходимо обернуть переменную в одинарные кавычки? <br/> <br/> <pre><code class="php">$myfile = fopen("../news/$latin.php", "w") or die("Unable to open file!");
    $txt = 
    '&lt;?php
                                $db = new PDO(dsn:"mysql:host=localhost;dbname=BorkiFestival_site", username:"root", password: "root");
                                $info = [];
                                $str = pathinfo(__FILE__, PATHINFO_FILENAME); // осторожно! необходима экранизация
                                if($query = $db-&gt;query("SELECT * FROM `news_cards` WHERE name_src LIKE ' $str'")){
                                    $info = $query-&gt;fetchAll(fetch_style: PDO::FETCH_ASSOC);
                                }else{
                                    print_r($db-&gt;ErrorInfo());
                                }
                                foreach($info as $data):?&gt;'
fwrite($myfile, $txt);
    fclose($myfile);</code></pre>
  • 7 октября 2024 г. 19:44
Ответы на вопрос 7
Чтобы передать переменную и обернуть её в одинарные кавычки в 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-кодом, в котором будет использоваться переменная и при этом корректно оформлены кавычки.
Перед кавычкой ставить обратный слэш 
if($query = $db->query("SELECT * FROM \`news_cards\` WHERE name_src LIKE \`$str\'")){
Первый вариант: использовать ' вместо ". 
Второй вариант: экранирование.
Способов сделать это -- великое множество, но возникает вопрос, "ЗАЧЕМ?" 

Как говаривал классик, "не нужна тебе такая админка, брат". Способ вредный, нерациональный, неудобный.

Вам нужно создать ОДИН файл, например news.php в котором будет только тот код, который вы экранируете.

И затем, просто подставлять в SQL запрос вашу переменную $str с уникальным slug новости.
В браузере будет выглядеть так:
site.ru/news.php?slug=pervomai

В php-скрипте получаете slug 'pervomai' (как и любые другие параметры адресной строки) через массив $_GET;
А именно

$str = $_GET['slug'];

В SQL пишете примерно

SELECT ...... WHERE name_src LIKE '$_GET["slug"]'

В итоге: один файл и хоть тысячу новостей через него можно посмотреть.

P.S Все, что получается из массива $_GET, нужно экранировать и обрабатывать, дабы не подставиться под SQL-инъекцию. Загуглите потом "prepared statements в PDO"
sprintf
Можно обернуть в функцию, а требуемую переменную дать аргументом
Используйте prepared statements. И пересмотрите архитектуру, генерировать код нужно только для очень специфичных задач, и уж точно не для того, чтобы "показать новости". Посмотрите на свой код, вы там ничего не генерируете, у вас статичный код и просто меняются данные.
Похожие вопросы