#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']}'", ...
Комментариев нет:
Отправить комментарий