В принципе, ваш код будет выглядеть так.
$entry = array(
'username' => $_POST['username'], //assuming it's comming from the post data or for instance $row['username'] if from previous select statement
'password' => $_POST['password'],
'email' => $_POST['email']
);
$sth = $dbh->prepare('INSERT into data (`username,` `password`, `email`) VALUES (:username, :password, :email)');
$sth->bindValue(':username', $entry['username'], PDO::PARAM_INT);
$sth->bindValue(':password', $entry['password'], PDO::PARAM_STR);
$sth->bindValue(':email', $entry['email'], PDO::PARAM_STR);
$sth->execute();
Если вы хотите, связанные переменные динамически созданные, то вам нужно создать с петлей на bindValue строки:
$entry = array(
'username' => $_POST['username'], //assuming it's comming from the post data or for instance $row['username'] if from previous select statement
'password' => $_POST['password'],
'email' => $_POST['email']
);
$sth = $dbh->prepare('INSERT into data (`username,` `password`, `email`) VALUES (:username, :password, :email)');
foreach($entry as $key => $value) {
$sth->bindValue(':'.$key, $entry[$key], PDO::PARAM_STR);
}
$sth->execute();
или внутри Еогеасп
$sth->bindValue(':'.$key, $value, PDO::PARAM_STR);
С вашего ключи (имя пользователя, пароль, электронная почта), их ключевые имена будут инициированы до ключевой переменной $, а их значения - переменной $ value. в первом случае она будет производить:
$sth->bindValue(':username', $entry['username'], PDO::PARAM_INT);
$sth->bindValue(':password', $entry['password'], PDO::PARAM_STR);
$sth->bindValue(':email', $entry['email'], PDO::PARAM_STR);
Что будет оцениваться по:
$sth->bindValue(':username', $_POST['username'], PDO::PARAM_INT);
$sth->bindValue(':password', $_POST['password'], PDO::PARAM_STR);
$sth->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
Во втором случае он будет непосредственно оцениваться.
Имейте в виду, что совершенно невозможно динамически создавать имена столбцов в запросе. И вы должны это сделать.Однако не полный запрос также трудно прочитать от других разработчиков. Вам достаточно динамически создавать связанные значения. Вы можете сделать способ сделать это за вас. Например, если имена столбцов в запросе совпадают с именами полей ввода, вам больше нечего делать, кроме как выполнить запрос.
Допустим, у вас есть этот вспомогательный метод:
Class DBConnect {
private $_driver = "mysql";
private $_dbname = "xxxx";
private $_host = "xxxx";
private $_user = "xxxx";
private $_password = "xxxx";
private $_port = 3306;
private $_dbh;
public function __construct($driver = NULL, $dbname = NULL, $host = NULL, $user = NULL, $pass = NULL, $port = NULL) {
$driver = $driver ?: $this->_driver;
$dbname = $dbname ?: $this->_dbname;
$host = $host ?: $this->_host;
$user = $user ?: $this->_user;
$pass = $pass ?: $this->_password;
$port = $port ?: $this->_port;
try {
$this->_dbh = new PDO("$driver:host=$host;port=$port;dbname=$dbname", $user, $pass);
$this->_dbh->exec("set names utf8");
} catch(PDOException $e) {
echo $e->getMessage();
}
}
public function query($sql) {
$sth = $this->_dbh->prepare($sql);
foreach ($_REQUEST as $key => $value) {
if(is_int($value)) {
$param = PDO::PARAM_INT;
} elseif(is_bool($value)) {
$param = PDO::PARAM_BOOL;
} elseif(is_null($value)) {
$param = PDO::PARAM_NULL;
} elseif(is_string($value)) {
$param = PDO::PARAM_STR;
} else {
$param = FALSE;
}
$sth->bindValue(":$key", $value, $param);
}
$sth->execute();
$result = $sth->fetchAll();
return $result;
}
}
Таким образом, позволяет сказать, в другом классе у вас есть много запросов, разделенных методами:
public function getFirstQuery() {
$sql = "SELECT
col1, col2
FROM table1
WHERE col3 = :col3;";
$query = $this->_db->query($sql);
return $query;
}
public function inserSecondquery() {
$sql = "INSERT INTO
`table1`
(col1, col2)
VALUES
((SELECT
id
FROM table2
WHERE col8 = :col8), :post_field_5);";
$query = $this->_db->query($sql);
return $query;
}
Предполагая, что вы назвали эти запросы метод query(), который также извлекает данные, выберите один из них, который вы можете запросить для извлечения данных, и вставку, которую вы можете просто вызвать, для вставки данных. Единственное правило здесь почтовые поля должны быть названы так же, как, например <input name="post_field_5" />
Вы также можете посмотреть здесь: PDO Dynamic Query Building
ОК, кажется, вам нужно найти библиотеку активная запись, подобная тем, которые использует CodeIgniter, или ... используйте CodeIgniter.
Из официальной документации:
http://ellislab.com/codeigniter/user-guide/database/helpers.html
$ this-> db-> insert_string();
Эта функция упрощает процесс записи вставки базы данных. Он возвращает правильно форматированную строку вставки SQL. Пример: $ data = array ('name' => $ name, 'email' => $ email, 'url' => $ url);
$ str = $ this-> db-> insert_string ('table_name', $ data);
Первый параметр - имя таблицы, второй - ассоциативный массив с данными для вставки. Приведенный выше пример производит: INSERT INTO table_name (имя, адрес электронной почты, URL) VALUES ('Rick', '[email protected]', 'example.com')
Таким образом, в вашем случае, вы может иметь что-то вроде этого:
<form action="" method="post">
<input type="text" name="username" value="testUser123" />
<input type="password" name="password" value="yourPass666" />
<input type="text" name="email" value="[email protected]" />
<input type="submit" value="submit" />
</form>
<?php
//... extending CI
//... opening a method
$table = 'data';
//comming from somewhere, let's dynamically populated array but for testing purpose I will hardcode:
$columns('username', 'password', 'email');
foreach($columns as $column) {
$data[$column] = $_POST[$column]; // this will produce $data=array('username'=>$_POST['username'],password=....);
}
$str = $this->db->insert_string($table, $data);
?>
Если вы отправите форму в начале, вы будете иметь:
INSERT INTO data (username, password, email) VALUES ('testUser123', 'yourPass666', '[email protected]');
весь активный записи класса документ (вставка выбранный здесь) http://ellislab.com/codeigniter/user-guide/database/active_record.html#insert
Я думаю, что у вас будет плохое время для динамического создания имен переменных. Используйте массивы, например $ entry ['username'], вместо $ entry_username. Также лучше использовать связанные параметры (bindValue() или bindParam) => 'for ($ i ....) {bindValue (": ". $ Column [$ i], $ entry ['$ column']); } ' –
Вы не можете использовать подстановку в именах столбцов, только значения. – RiggsFolly
@RoyalBg как бы использовать bindValue() или bindParam? – SteppingHat