2013-08-19 3 views
0

Для инструкции выполнения PDO я пытаюсь сделать любую статическую информацию, такую ​​как имена столбцов и строки массива, динамическому массиву, который содержит каждый столбец из таблицы MySQL.PHP - для оператора в массиве

Исходный код был:

$stmt = $conn->prepare("INSERT into data (`username,` `password`, `email`) VALUES username = :username , password = :password , email = :email "); 

$stmt->execute(array(
    ':username' => $entry_username, 
    ':password' => $entry_password, 
    ':email' => $entry_email 
)); 

До сих пор я был в состоянии изменить SQL заявление

$sql = "INSERT into DATA (`" . implode('`,`', $columns) . "`) values (:" . implode(',:', $columns) . ")"; 
$stmt = $conn->prepare($sql); 

, но не смогли сделать подобную вещь в массив выполнения, чтобы сделать он динамически изменяется как утверждение.

Я попытался добавив для постановки в массиве

for ($i = 0; $i < count($columns); $i++) { 
    ':'.$columns[$i] => ${'entry_'.$columns[$i]}; 
} 

, но это не сработало.

Любая помощь будет высоко оценена. Спасибо заранее!

+0

Я думаю, что у вас будет плохое время для динамического создания имен переменных. Используйте массивы, например $ entry ['username'], вместо $ entry_username. Также лучше использовать связанные параметры (bindValue() или bindParam) => 'for ($ i ....) {bindValue (": ". $ Column [$ i], $ entry ['$ column']); } ' –

+0

Вы не можете использовать подстановку в именах столбцов, только значения. – RiggsFolly

+0

@RoyalBg как бы использовать bindValue() или bindParam? – SteppingHat

ответ

-1

Если вам не нужно придерживаться цикла for, я бы предложил foreach, который должен быть проще (я знаю, с небольшими проблемами тоже).

foreach ($element in $array) { code execution here }

Ваш элемент массива сохраняется в $ элемента (или как вы хотели назвать его), и вы можете выполнить команду найти там.

Это то, что вы ищете, или я понял, что вы ошибаетесь?

+0

Как простое изменение с помощью foreach решит проблему? –

+0

Я не понимаю, как это будет работать. Ха-ха, простите, я раньше не использовал foreach. – SteppingHat

+0

Было бы одинаково, однако проблема в коде, который должен выполняться в цикле, а не в том, что делает цикл –

0

Это идеальная ситуация, чтобы хорошо использовать подготовленное заявление.

Попробуйте следующее: Я как бы предполагаю, что varuables будет вызываться в массиве $ columns здесь.

$stmt = $conn->prepare("INSERT into data 
     (username, password, email) VALUES(:username , :password, :email)"); 

$stmt->bindParam(':username', $username, PDO::PARAM_STR); 
$stmt->bindParam(':password', $password, PDO::PARAM_STR); 
$stmt->bindParam(':email', $email, PDO::PARAM_STR); 

foreach ($columns as $column) { 

    $username = $column['username']; 
    $password = $column['password']; 
    $email = $column['email']; 

    $result = $stmt->execute(); 

    if (! $result) { 
     // add some error checking code here 
    } 
} 
+0

Исправьте меня, если не так, но автор хочет также, чтобы выполненный массив был динамически создан. Btw. Я думаю, что нет необходимости в «VALUES (username = ...)», это может быть просто «VALUES (: username,: password,: email)» –

+0

Это не то, чего я пытаюсь достичь. То, что я пытаюсь сделать, - полностью избавиться от слов username, password и email и заменить их на столбец $ $, который представляет собой массив, который содержит эти слова и, возможно, меньше или больше, чтобы сделать динамический запрос подходящим для таблицы. – SteppingHat

+0

@SteppingHat Но, как я сказал, НЕ РАЗРЕШЕН – RiggsFolly

0

В принципе, ваш код будет выглядеть так.

$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

+0

Сорта, но не совсем то, что я пытаюсь выполнить. По сути, имя пользователя, пароль и адрес электронной почты обычно не отображаются в коде, поскольку они могут быть совершенно разными. Для этого нужен массив $ columns. Он содержит все ключевые слова. Если бы это сработало, я бы поставил цикл цикла в массив выполнения (первый блок кода в вопросе) и распечатал '': '. $ Columns [$ i] => $ {' entry _ '. $ Columns [ $ i]} ', если это может сработать. Но это невозможно, и я не могу понять, как это сделать с допустимым синтаксисом/логикой. – SteppingHat

+0

введите массив столбцов в массив $ entry, позвольте мне привести другой пример –

+0

. Посмотрите здесь: http://stackoverflow.com/questions/11838068/pdo-dynamic-query-building –

Смежные вопросы