Можно ли сделать этот код действительным / ускорить? - PullRequest
1 голос
/ 24 августа 2010

У меня есть форма регистрации, которая принимает информацию о потребителе, сохраняет ее в сеансе, передает со страницы на страницу, а затем сохраняет в базе данных после завершения. Первоначально в таблице просто перечислялись поля на срок до 16 человек, но после прочтения в реляционных базах данных было глупо

С тех пор я создал таблицу с именами «члены» и «менеджеры». Каждая регистрация будет принимать ввод информации, сохранять идентификатор менеджера в соответствующей таблице и помещать поле ссылки в каждой строке участника, содержащей идентификатор менеджера.

Хотя я допускаю одновременную регистрацию до 16 участников, это может быть от 1 до 16.

Мое лучшее предположение состоит в том, чтобы использовать цикл FOR для запуска, хотя несколько операторов INSERT в случае, если зарегистрировано более 1 члена.

В приведенном ниже примере я использую переменную $ num для представления информации об отдельном члене и $ total для представления количества всех зарегистрированных участников. Код здесь не работает, но я ищу:

а) способы исправления

б) понять, есть ли более «эффективные» способы сделать этот тип ВСТАВКИ

пример кода:

<?php 
    $conn = mysql_connect("localhost", "username", "pw");
    mysql_select_db("db",$conn);

    for ($num=1; $num<=$total; $num++) {

    $sql = "INSERT INTO table VALUES ('', '$clean_f'.$num.'fname', '$clean_f.$num.mi', '$clean_f.$num.lname', '$clean_f.$num.fednum', '$clean_f.$num.dob', '$clean_f.$num.ssn', '$clean_f.$num.address', '$clean_f.$num.city', '$clean_f.$num.state', '$clean_f.$num.zip', '$clean_f.$num.phone', '$clean_f.$num.email')";

    $result = mysql_query($sql, $conn) or die(mysql_error());
    }

    mysql_close($conn);
    header("Location: completed.php");
?>

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Если все ваши операторы структурно одинаковы, но с разными значениями параметров, рассмотрите возможность использования расширения PDO, которое поддерживает подготовленные операторы. Преимущества подготовленных операторов можно прочитать здесь (http://www.php.net/manual/en/pdo.prepared-statements.php),, но в общем случае один и тот же оператор нужно будет скомпилировать только один раз, но он может быть выполнен столько раз, сколько вы хотите, с различными параметрами, которые могут сделать ваш скрипт более "эффективный".

Используя PDO, ваш код может выглядеть примерно так:

$db = new PDO('mysql:host=localhost;dbname=db', 'username', 'pw');

$statement = $db->prepare('INSERT INTO tablename (field1, field2, field3, ...) VALUES (?,?,?,?');

for ($num=1; $num<=$total; $num++) {
    $statement->execute(array('val1', 'val2', 'val3', '...'));
}
1 голос
/ 24 августа 2010

Как правило, помещать запрос в цикл - это плохо.Обычно есть лучший способ.В этом случае вы должны использовать синтаксис с несколькими вставками.Ваш INSERT не работает, потому что вы не указали поля.Я предполагаю, что отсутствие пробела между именем таблицы и VALUES является опечаткой, наряду с неправильным цитированием.

INSERT INTO table_name (field1, fname, lname, fednum, ...) 
VALUES ('val1', 'Pete', 'Moss', 1234), 
('val2', 'T.', 'Cupp', 54321), 
('val3', 'Youdid', 'Watt', 787123);
0 голосов
/ 24 августа 2010

Если я правильно вас понял, решение состоит в том, чтобы начать с фиксированной строки запроса:

$queryString = "INSERT INTO table (field1, field2, ...) VALUES ";

, затем запустите цикл для создания ковкой детали. Размещение ваших значений в массивах облегчает задачу:

$queryInsert = '';
$total = count($value1Array);
while ($i < $total) {
    $queryInsert .= "('$value1Array[$i]','$value2Array[$i]','$value3Array[$i],...), ";
    ++$i;
}

затем добавьте к первому фрагменту запроса:

$queryString = $queryString.$queryInsert;

и обрежьте трейлинг , и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...