2013-07-02 3 views
0

Итак, я создаю базовое приложение cms, чтобы попытаться изучить PDO немного более подробно, но, похоже, я наткнулся на проблему. Я хочу, чтобы иметь возможность использовать функцию для вставки данных в базу данных MySQL, и до сих пор я получил этот код ...PHP PDO Вставить в проблему с функцией базы данных

public function insert($table, $rows, $values) { 

     $data = $values; 

     $STH = $this->DBH->("INSERT INTO `" . $table . "` (". $rows . ") values (?, ?, ?)"); 

    } 

ли вопросительные знаки для значений представляют собой количество элементов данных Я буду входить в базу данных? Если да, то как я могу узнать количество данных, которые будут введены на основе массива $ data? (Все значения $ будут введены с форматом «значение, значение2, значение3» и т. Д.)

Надеюсь, я разъяснил, о чем я прошу, я довольно плохо объясняю себя ха-ха .. Благодарю.

+0

Да, вам нужно знать, что вы вставляете ... это не волшебство. –

+0

Что @DanyCaissy сказал. Кроме того, вещи, которые вы называете '$ rows' в вашем коде, являются не строками, а столбцами или полями, может быть, это является причиной вашей путаницы? – fvu

+0

было бы полезно посмотреть, что находится в $ rows, но если это не похоже на «foo, bar, baz», вы, вероятно, создаете недопустимый SQL. ваш счетчик полей должен соответствовать количеству значений (например, если $ rows - это 4 поля, то задание 3 заполнителей для значений является синтаксической ошибкой). –

ответ

0

Вы можете сделать подготовленный оператор со случайным числом значений, если ваши значения являются массивом. Пример (непроверенные):

public function insert($table, $rows, $values) { 
    $params = rtrim(", ", str_repeat("?, ", count($values))); 
    try { 
    $stmt = $this->DBH->prepare("INSERT INTO $table ($rows) VALUES ($params)"); 
    for($i = 1; $i <= count($values); $i++) { 
     $stmt->bindValue($i, $values[$i-1]); 
    } 
    $stmt->execute(); 
    return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } catch(PDOException $e) { 
    echo "Oops... {$e->getMessage()}"; 
    } 
} 

Редактировать Передача только два параметра ($table и $data как ассоциативный массив), вы могли бы сделать что-то вроде этого (непроверенные):

public function insert($table, $data) { 
    $keys = array_keys($data); 
    $values = array_values($data); 
    $params = rtrim(", ", str_repeat("?, ", count($values))); 
    try { 
    $stmt = $this->DBH->prepare("INSERT INTO $table (`".implode("`,`", $keys)."`) VALUES ($params)"); 
    $stmt->execute($values); 
    return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } catch(PDOException $e) { 
    echo "Oops... {$e->getMessage()}"; 
    } 
} 
0

Пока ваш $ data - массив, вы можете просто передать его методу выполнения в PDO :: Statement после его подготовки. Когда вопросительные знаки используются для связывания он просто требует неассоциативного массива значений в порядке, что вы хотите их оценка (в порядке ваших вопросительные знаки появляются в запросе)

public function insert($table, $rows, $values) { 
    $data = $values; 
    $STH = $this->DBH->prepare("INSERT INTO `" . $table . "` (". $rows . ") values (?, ?, ?)"); 
    $STH->execute($data); 
} 

Вы также можете использовать имена привязка:

public function insert($table, $rows, $values) { 
    $data = array(":col1" => $values[0], ":col2" => $values[1], ":col3" => $values[2]); 
    $STH = $this->DBH->prepare("INSERT INTO `" . $table . "` (". $rows . ") values (:col1, :col2, :col3)"); 
    $STH->execute($data); 
} 
Смежные вопросы