Ciao, ho dei problemi nel mio codice ad interagire con in database. Le tabelle vengono create correttamente, le SELECT funzionano ma le INSERT e gli UPDATE no e non ne capisco il motivo.
In un file Database.php faccio:
Per creare le varie tabelle faccio in questo modo:
Poi, per esempio, ho una classe User.php che implementa il metodo findUser($username) fatto così:
dove il metodo load(array $data) è:
i metodi get() e set() sono fatti in questo modo (sono tutti uguali quindi posto solo quello relativo al nome):
Quando devo inserire un nuovo utente nel database (cosa che non funziona) faccio in questo modo:
Dove save() si trova in User.php ed è:
Quando invece faccio una modifica (anche questo non va) ad un utente presente nel database faccio così:
Come mai queste due operazioni (INSERT e UPDATE) non vanno?
Grazie
In un file Database.php faccio:
PHP:
class Database {
private static $instance = null;
private static $dsn = "mysql:host=localhost;dbname=example";
private static $username = 'root';
private static $password = 'example';
private $connection = null;
private function __construct() {
$this->connection = new PDO(static::$dsn, static::$username, static::$password);
}
public static function getInstance() {
if(!static::$instance) {
static::$instance = new Database();
}
return static::$instance;
}
public static function configConnection($dsn, $username, $password) {
if(static::$instance) {
throw new Exception("Connessione già stabilita.");
}
static::$dsn = $dsn;
static::$username = $username;
static::$password = $password;
}
public function connection() {
return $this->connection;
}
public function exec($statement) {
if($this->connection->exec($statement) === false) {
throw new Exception("Database exec fallita.");
}
}
public function prepare($statement) {
$prepared = $this->connection->prepare($statement);
$prepared->setFetchMode(PDO::FETCH_ASSOC);
return $prepared;
}
public function lastInsertedId() {
return $this->connection->lastInsertId();
}
}
Per creare le varie tabelle faccio in questo modo:
PHP:
$db = Database::getInstance();
$query = "CREATE TABLE IF NOT EXISTS ex1 (
id INTEGER(4) NOT NULL,
... ecc ...
PRIMARY KEY(id)
);";
$stmt = $db->prepare($query);
$stmt->execute();
Poi, per esempio, ho una classe User.php che implementa il metodo findUser($username) fatto così:
PHP:
public function findUser($username) {
$db = Database::getInstance();
$stmt = $db->prepare("SELECT * FROM `users` WHERE `username` = ?");
$stmt->execute(array($username));
$user = null;
if($stmt->rowCount()) {
$user = User::load($stmt->fetch());
}
return $user;
}
PHP:
public static function load(array $data) {
$u = new User();
$u->id = $data['id'];
$u->setUsername($data['username']);
$u->password = $data['password'];
$u->setEmail($data['email']);
$u->setFirstName($data['first_name']);
$u->setLastName($data['last_name']);
return $u;
}
i metodi get() e set() sono fatti in questo modo (sono tutti uguali quindi posto solo quello relativo al nome):
PHP:
public function getFirstName(){
return $this->first_name;
}
public function setFirstName($firstName){
$this->first_name = $firstName;
}
Quando devo inserire un nuovo utente nel database (cosa che non funziona) faccio in questo modo:
PHP:
public $user;
public $userRepository;
$this->userRepository = new UserRepository();
$db = Database::getInstance();
$this->user = new User();
$this->user->setUsername($username);
$this->user->setEmail($email);
$this->user->setPassword($password);
$this->user->save();
Dove save() si trova in User.php ed è:
PHP:
public function save() {
$new = is_null($this->id);
$db = Database::getInstance();
if($new) {
$sql = "INSERT INTO 'users' ('username', 'password', 'email', 'first_name', 'last_name') "
. "VALUES (?, ?, ?, ?, ?)";
$stmt = $db->prepare($sql);
$stmt->execute(array($this->getUsername(), $this->password, $this->getEmail(), $this->getFirstName(), $this->getLastName()));
$this->id = $db->lastInsertedId();
}
else {
$sql = "UPDATE 'users' SET 'username' = ?, 'password' = ?, 'email' = ?, 'first_name' = ?, 'last_name' = ? WHERE 'id' = ?";
$stmt = $db->prepare($sql);
$stmt->execute(array($this->getUsername(), $this->password, $this->getEmail(), $this->getFirstName(), $this->getLastName(), $this->id));
}
}
Quando invece faccio una modifica (anche questo non va) ad un utente presente nel database faccio così:
PHP:
public $user;
public $userRepository;
$this->userRepository = new UserRepository();
$this->user = $this->userRepository->findByUsername($username);
$db = Database::getInstance();
$this->user->setFirstName($first_name);
$this->user->save();
Come mai queste due operazioni (INSERT e UPDATE) non vanno?
Grazie