#php #oop #class #object #model
#php #ооп #класс #объект #Модель
Вопрос:
<?php
class ann {
public function __construct($context, $orgs_id, $created_at) {
$this->context = $context;
$this->orgs_id = $orgs_id;
$this->created_at = $created_at;
}
function create(){
$createann = mysql_query("INSERT INTO anns(context,
orgs_id, created_at)
VALUES('$this->context',
$this->orgs_id, '$this->created_at'");
if($createann) echo "Duyuru Başarıyla Eklendi"; else echo "Duyuru
Eklenemedi";
}
function read($id){
$readann = mysql_query("SELECT * FROM anns WHERE id = $id");
$context = mysql_result($readann,0, "context");
$orgs_id = mysql_result($readann,0, "orgs_id");
$created_at = mysql_result($readann,0,
"created_at");
$ann = new ann($context, $orgs_id, $created_at);
return $ann;
}
function update($id, $context){
$updateann = mysql_query("UPDATE anns SET context =
'$context' WHERE id = $id");
if($updateann) echo "Update success"; else echo
"Update failed";
}
function delete($id){
$deleteann = mysql_query("DELETE FROM anns WHERE id
= $id");
if($deleteann) echo "Delete success"; else echo "Delete not success";
}
//crud fonksiyonlari burda bitiyor
}
?>
Здесь что-то не так с нашей логикой, но мы очень новички в php. Мы пытались создать rails-подобные модели, но, по-моему, что-то в нашей нотации class-object неверно. Итак, код не сработал. Мы даже не можем создать какой-либо объект с его помощью.
Спасибо вам, ребята
Комментарии:
1. Комментарий вашего кода внизу удаляет закрывающий } для класса. Эта ошибка только в сообщении?
2. да, это была просто ошибка в сообщении, спасибо, что указали
3. спасибо за предупреждения о внедрении, но мы используем фильтр до того, как строки поступят для создания объекта.
Ответ №1:
context
orgs_id
и created_at
должны быть сначала должны быть объявлены как общедоступные, частные или защищенные, прежде чем вы будете их использовать.
В вашем create
методе вы не фильтруете пользовательский ввод. Это может привести к SQL-инъекции вашего приложения, вам всегда нужно фильтровать пользовательский ввод. Используйте либо mysql_real_escape_string, либо подготовленный statment с помощью PDO.
Вы можете ознакомиться с этим руководством.
Ответ №2:
две вещи (которые, возможно, применимы только к вашему приведенному здесь образцу кода):
- В вашем примере вы не закрываете свой класс, потому что последнее «}» закомментировано.
- Вы никогда не открывали соединение с вашей базой данных, поэтому запрос завершится ошибкой.
Ответ №3:
несколько наблюдений:
объявление атрибутов в конструкторе возможно, но это не элегантно. Я бы предпочел сделать:
class ann {
private $context;
private $orgs_id;
оператор «->» не будет работать внутри строки. Вам нужно будет объединить запрос:
"INSERT INTO anns(context,orgs_id, created_at) VALUES('".$this->context."',".$this->orgs_id".", '".$this->created_at."'"
но будьте осторожны при sql-инъекции
Остальное должно быть в порядке! Удачи.
Комментарии:
1. Вы можете использовать объектные операторы внутри строк, если обернете их в {} например, «Значение свойства равно {$object-> свойство}»;
2. Здесь также есть очень хороший учебник о хороших методах ООП на PHP: phpfreaks.com/tutorial/oo-php-part-2-boring-oo-principles