У меня проблема, когда я не могу вставить что-либо в базу данных MySQL, используя PDO.
Я не получаю ошибок, но всякий раз, когда я проверяю базу данных, если строка была вставлена, таблица пуста.
Я знаю, что у меня есть соединение с базой данных, поскольку я могу выбирать, но не вставлять.
Вот мой класс, который заставляет PDO
class Database extends PDO { public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS) { parent::__construct($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME, $DB_USER, $DB_PASS); //parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTIONS); } /** * select * @param string $sql An SQL string * @param array $array Paramters to bind * @param constant $fetchMode A PDO Fetch mode * @return mixed */ public function select($sql, $array = array(), $fetchMode = PDO::FETCH_ASSOC) { $sth = $this->prepare($sql); foreach ($array as $key => $value) { $sth->bindValue("$key", $value); } $sth->execute(); return $sth->fetchAll($fetchMode); } /** * insert * @param string $table A name of table to insert into * @param string $data An associative array */ public function insert($table, $data) { /*ksort($data); $fieldNames = implode('`, `', array_keys($data)); $fieldValues = ':' . implode(', :', array_keys($data)); $sth = $this->prepare("INSERT INTO $table (`$fieldNames`) VALUES ($fieldValues)"); foreach ($data as $key => $value) { $sth->bindValue(":$key", $value); }*/ $sth = $this->prepare("INSERT INTO user (`login`, `password`, `role`) VALUES (:login, :password, :role)"); $sth->bindValue(':login', 'username'); $sth->bindValue(':password', 'password'); $sth->bindValue(':role', 'owner'); $sth->execute(); /*if ($sth->errorCode() != 0) { $arr = $sth->ErrorInfo(); throw new Exception('SQL failure:'.$arr[0].':'.$arr[1].':'.$arr[2]); }*/ $sth->debugDumpParams(); }
Вот моя структура таблицы (она была простой для отладки).
CREATE TABLE IF NOT EXISTS `user` ( `userid` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(25) NOT NULL, `password` varchar(64) NOT NULL, `role` enum('default','admin','owner') NOT NULL DEFAULT 'default', PRIMARY KEY (`userid`) ) ENGINE=InnoDB
РЕДАКТИРОВАТЬ:
Я узнал, где проблема. Проблема заключается в массиве данных. Если я использую $ data ['first_name'] при вызове функции insert (), он терпит неудачу, но если я заменил все эти значения $ data [] значениями жестких кодов, это работает, поэтому проблема заключается в $ data []
Я создаю массив переменных POST
// get all the post data from the registration form $data = array(); $data['first_name'] = $_POST['first_name']; $data['last_name'] = $_POST['last_name']; $data['gender'] = $_POST['gender']; $data['email'] = $_POST['email']; $data['interests'] = $_POST['interests']; $data['username'] = $_POST['username']; $data['password'] = $_POST['password']; $data['newsletter'] = $_POST['newsletter']; $data['terms'] = $_POST['terms']; $data['captcha'] = $_POST['captcha'];
Это передается функции create
public function create($data) { $this->db->insert('users', array( 'first_name' => $data['first_name'], //this won't work 'first_name' => 'whatever the name is', //this will work 'last_name' => $data['last_name'], 'email' => $data['email'], 'username' => $data['username'], 'password' => $password, 'user_salt' => $user_salt, 'sex' => $data['gender'], 'interests' => $data['interests'], 'signup_date' => date('Ymd H:i:s'), 'verification_code' => $code ));
и вот где он вставлен
public function insert($table, $data) { ksort($data); $fieldNames = implode('`, `', array_keys($data)); $fieldValues = ':' . implode(', :', array_keys($data)); $sth = $this->prepare("INSERT INTO $table (`$fieldNames`) VALUES ($fieldValues)"); foreach ($data as $key => $value) { $sth->bindValue(":$key", $value); } $sth->execute(); }
$fieldValues = implode(':,', array_keys($data));
Попробуй это,
$fieldNames = implode(', ', array_keys($data)); $fieldValues = ':' . implode(', :', array_values($data)); $sth = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues)");