Несколько вставок в 3 таблицы с PDO - PullRequest
2 голосов
/ 15 апреля 2011

Как вы можете сделать 3 разных INSERT таблицы с PDO, которые SQL-запрос генерирует с помощью цикла for, например,

Мой скрипт очень большой, поэтому я собираюсь сузить его до основногоФакторы кода.

$date_sql = '';
for($i = 0; $i < count($_POST['date_range']); $i++)
{
    // codez

    $date_sql .= " INSERT INTO dates (date_one, date_two) VALUES('" . $_POST['date_range'][$i] . "', '" . $_POST['date_range_end'][$i] . "'); ";

    // more codez
}

У меня есть 3 для циклов, которые такие же, как этот цикл, который я дал, но разные значения $_POST и разные таблицы: months, years.Он генерирует многострочный SQL-запрос из переменной $*_sql.

После того, как 3 цикла выполнены, я объединяю переменные 3 sql в строку:

$main_sql = $date_sql . $month_sql . $year_sql;

Затем я хочу, чтобы он выполнил SQL, который его обрабатывает, и вставляет значения в таблицы.вот так:

$dbh->beginTransaction();

$sth = $dbh->exec($main_sql);

$dbh->commit();

Но правильный ли это, эффективный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Более вероятный способ сделать это - использовать подготовленное утверждение. После того как вы подготовили его, вы можете выполнить его несколько раз, просто изменив значения.

$sql = "INSERT INTO dates (date_one, date_two) VALUES(:one, :two)";
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

for($i = 0; $i < count($_POST['date_range']); $i++) {
   $sth->execute(array(':one' => $_POST['date_range'][$i], ':two' => '$_POST['date_range_end'][$i]));
}
0 голосов
/ 15 апреля 2011

Нет, это не правильный, предпочтительный и эффективный способ сделать это.Вы хотели бы взглянуть на подготовленные операторы PDO: pdo-> prepare () , pdoStatement-> bindParam () , pdostatement-> execute () и pdostatement-> fetch ()

0 голосов
/ 15 апреля 2011

То, как вы описываете, будет работать, оно выполнит три команды, но, поскольку они очень малы, это не сильно повлияет на базу данных.

Другим способом было бы отформатировать запрос, который выглядит следующим образом:

INSERT INTO dates (date_one, date_two)
SELECT $_POST['date_range'][0] , $_POST['date_range_end'][0]
UNION SELECT $_POST['date_range'][1] , $_POST['date_range_end'][1]
UNION SELECT $_POST['date_range'][2] , $_POST['date_range_end'][2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...