Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Как вставить значение переменной внутрь строки?

#php #ооп #синтаксический_анализ #классы


Пишу класс соединения с базой, в котором есть метод подключения, выборки из таблицы,
вставки в таблицу новых данных.

Со вставкой возникла проблема: появляется ошибка следующего характера:


  Parse error: syntax error, unexpected '$rowNews' (T_VARIABLE) in C:\xampp\htdocs\sait12.loc\controller.php
on line 24


Я так понял, что это просто синтаксическая ошибка, что-то с кавычками, наверное.
Пробовал и в двойных, и без них вообще — не помогает.

Подскажите, в чём может быть дело, или научите как найти, что не так.

Код класса:

class DB_connect {
    protected $host = 'localhost';
    protected $baza = 'moya2';
    protected $user = 'admin123';
    protected $pass = '123';

        protected function __construct() {
            $connect = mysql_connect($this->host, $this->user, $this->pass);
            mysql_query("SET NAMES 'utf8';"); 
            mysql_query("SET CHARACTER SET 'utf8';"); 
            mysql_query("SET SESSION collation_connection = 'utf8_general_ci';");
            mysql_select_db($this->baza);
        }

        public function getArticles() {
            self::__construct();
            $row_articles = mysql_query('SELECT * FROM articles');
            return $row_articles;
        }

        public function insert($rowNews) {
            self::__construct();
            $addNews = "INSERT INTO articles (title, title_en, text, author, hashteg)
VALUES('"$rowNews['title']"', '"$rowNews['title_en']"', '"$rowNews['text']"', '"$rowNews['author']"',
'"$rowNews['hashteg']"')";
            $result = mysql_query($addNews) or die(mysql_error());
            mysql_close(self::__construct()->$connect);
        }
}


Доработал немного код...попытался добавить некую фильтрацию данных на входе и воспользовался
конкатенацией. Народ если у кого будет время и желание гляньте код. В правильном ли
направлении я вообще двигаюсь? Есть конечно очень сильное ощущение что операции с базой
типа выбрать, взять, вставить, обновить, удалить должны быть в отдельном классе. Так
ли это?)) заранее спасибо за ответы...

class DB_connect {

    /*Задаю свойства класса*/

    protected $host = 'localhost';
    protected $baza = 'moya2';
    protected $user = 'admin123';
    protected $pass = '123';
    private $connect = null; /*Правильно ли так задавать свойство для соединения
с базой?*/

    /*Конструктор для подключения к базе данных*/

        public function __construct() {
            $this->connect = mysql_connect($this->host, $this->user, $this->pass);
            mysql_query("SET NAMES 'utf8';"); 
            mysql_query("SET CHARACTER SET 'utf8';"); 
            mysql_query("SET SESSION collation_connection = 'utf8_general_ci';");
            mysql_select_db($this->baza);
        }

        /*Метод закрытия соединения с базой данных*/

        public function Close() {
            if($this->connect) {
                mysql_close($this->connect);
                echo 'Соединение с базой данных закрыто';
            }
        }

        /*Метод получения данных из таблицы articles*/

        public function getArticles() {
            self::__construct();
            $row_articles = mysql_query('SELECT * FROM articles');
            return $row_articles;
            self::Close();
        }

        /*Метод вставки статьи в таблицу articles*/

        public function insert($rowNews) {
            $rowNews = filter_var_array($rowNews);/*Попытка фильтрации входных данных*/
            self::__construct();
            $addNews = "INSERT INTO articles (title, title_en, text, author, hashteg)
VALUES('".$rowNews['title']."', '".$rowNews['title_en']."', '".$rowNews['text']."',
'".$rowNews['author']."', '".$rowNews['hashteg']."')";
            $result = mysql_query($addNews) or die(mysql_error());
            self::Close();
        }
}

    


Ответы

Ответ 1



Вы неправильно строки объединяете, потому и ругается. Несколько решений: Первое - встраиваем массив в строку: $a = array( 'abc' => 'csa', ); echo "arr: $a[abc]\n"; // arr: csa Т.е. никаких кавычек в массиве, никаких склеивания строк вида "строка" $param. Правда, с одинарными кавычками ('a = $a') это не работает и будет выведено все строкой (т.е. выведет a = $a). Для вашего кода: $addNews = "INSERT INTO articles (title, title_en, text, author, hashteg) VALUES('$rowNews[title]', '$rowNews[title_en]', '$rowNews[text]', '$rowNews[author]', '$rowNews[hashteg]')"; Второе - конкатенация строк: $a = 'qwerty'; echo "a = " . $a; // a = qwerty Для вашего кода: $addNews = "INSERT INTO articles (title, title_en, text, author, hashteg) VALUES('" . $rowNews['title'] . "', '" . $rowNews['title_en'] . "', '" . $rowNews['text'] . "', '" . $rowNews['author'] . "', '" . $rowNews['hashteg'] . "')"; Третье - использование sprintf: $a = 'qwe'; $b = 'asd'; sprintf('a = %s, b = %s and a = %s', $a, $b, $a); // a = qwe, b = asd and a = qwe sprintf('a = %1$s, b = %2$s and a = %1$s', $a, $b); // a = qwe, b = asd and a = qwe Для вашего кода: $sql = "INSERT INTO articles (title, title_en, text, author, hashteg) VALUES('%s', '%s', '%s', '%s', '%s')"; $addNews = sprintf($sql, $rowNews['title'], $rowNews['title_en'], $rowNews['text'], $rowNews['author'], $rowNews['hashteg']); P.S.: для вашего кода ни один из вариантов не является правильным из-за того, что не проверяются входные значения (читайте про sql-инъекции)

Ответ 2



конкатенация строк (и строковых значений переменных) в php осуществляется точками: "какая-то строка" . "ещё строка" . $var . "и ещё строка" в приложении к вашему коду: "какая-то строка" . $rowNews['title'] . "ещё строка"

Ответ 3



$addNews = "INSERT INTO articles (title, title_en, text, author, hashteg) VALUES('".$rowNews['title']."', '".$rowNews['title_en']."', '".$rowNews['text']."', '".$rowNews['author']."', '".$rowNews['hashteg']."')"; Это самый простой вариант. Есть ещё sql инъекции. Этот вариант от них не защищает

Ответ 4



Можно писать так ... , "'{$rowNews['title_en']}'", ...

Комментариев нет:

Отправить комментарий