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