可以使此代码有效/加速吗?

时间:2010-08-23 23:48:38

标签: php mysql insert for-loop

我有一个注册表单,它接收消费者信息,将其存储在会话中,从一个页面传递到另一个页面,然后在完成时存储在数据库中。最初该表只列出了最多16人的字段,但在阅读关系数据库后,发现这是愚蠢的。

我创建了一个名为“members”和“managers”的表。每个注册都将获取信息输入,将经理ID存储在相应的表中,并在包含经理ID的每个成员行中放置一个引用字段。

虽然我允许一次注册最多16名成员,但这可以是1-16。

我最好的猜测是在注册多于1个成员的情况下使用FOR循环来运行多个INSERT语句。

在下面的示例中,我使用变量$ num来表示单个成员的信息,使用$ total来表示正在注册的所有成员的数量。这里的代码不起作用,但我正在寻找:

a)纠正方法

b)了解是否有更多“有效”的方式来执行此类INSERT

示例代码:

<?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 个答案:

答案 0 :(得分:2)

如果所有语句在结构上相同但具有不同的参数值,请考虑使用支持预准备语句的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 :(得分:1)

通常,将查询放在循环中是件坏事。通常有更好的方法。在这种情况下,您应该使用多插入语法。您的INSERT无效,因为您没有指定字段。我假设表名和VALUES之间缺少空格是一个错误,以及错误的引用。

INSERT INTO table_name (field1, fname, lname, fednum, ...) 
VALUES ('val1', 'Pete', 'Moss', 1234), 
('val2', 'T.', 'Cupp', 54321), 
('val3', 'Youdid', 'Watt', 787123);

答案 2 :(得分:0)

如果我读到你的话,解决方法是从固定的查询字符串开始:

$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;

并修剪尾随的,,你很高兴。