Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以使此代码有效/加速?_Php_Mysql_Insert_For Loop - Fatal编程技术网

Php 是否可以使此代码有效/加速?

Php 是否可以使此代码有效/加速?,php,mysql,insert,for-loop,Php,Mysql,Insert,For Loop,我有一个注册表单,它获取消费者信息,存储在会话中,从一页传递到另一页,完成后存储在数据库中。最初该表只列出最多16人的字段,但在读入关系数据库后,发现这是愚蠢的 此后,我创建了一个名为“members”和“managers”的表。每个注册都将接受信息输入,将经理ID存储在相应的表中,并在包含经理ID的每个成员行中放置一个引用字段 虽然我允许一次最多注册16名成员,但这可以从1到16名不等 我的最佳猜测是使用FOR循环在注册了多个成员的事件中运行多个INSERT语句 在下面的示例中,我使用变量$n

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

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

虽然我允许一次最多注册16名成员,但这可以从1到16名不等

我的最佳猜测是使用FOR循环在注册了多个成员的事件中运行多个INSERT语句

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

a) 纠正方法

b) 了解是否有更“有效”的方法来执行此类插入

示例代码:
一般来说,将查询放入循环是件坏事。通常有更好的方法。在这种情况下,应该使用multi-insert语法。插入无效,因为您没有指定字段。我假设表名和值之间缺少空格是一个输入错误,加上错误的引用

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

如果所有语句结构相同,但参数值不同,请考虑使用支持准备语句的PDO扩展。可以在这里()阅读准备好的语句的好处,但是一般来说,同一条语句只需要编译一次,但是可以使用不同的参数执行任意多次,这可以使脚本更加“高效”

使用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', '...'));
}
$db=newpdo('mysql:host=localhost;dbname=db','username','pw');
$statement=$db->prepare('INSERT INTO tablename(field1,field2,field3,…)值(?,,,,?);
对于($num=1;$numexecute(数组('val1','val2','val3','…');
}

如果我没看错的话,解决方案是从固定查询字符串开始:

$queryString = "INSERT INTO table (field1, field2, ...) VALUES ";
然后运行一个循环来构建可延展部分。将您的值放入数组会使事情变得更简单:

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

然后修剪掉尾随的
,你就可以开始了。

你的代码假设我知道要执行多少个insert语句。我不知道val2,3,4,5,6,7,8+是否存在。我只知道需要一个成员,一次最多可以有16个,但这取决于用户。你可以插入到任何表中,而不必顺便命名字段(虽然是的,但我同意这是一个糟糕的做法)然后使用for循环在
值(
之后构建一个包含所有内容的字符串,并在末尾附加另一个
来限制它。然后你仍然只需要一个查询,而不需要知道有多少查询。@Andrew-我想这是我的直接问题。另外-值只有()意味着一次插入。这个想法是有可能用新信息创建14+行,而不是全部在一行中。我上面给出的示例将创建3行。不确定“全部在一行中”是什么意思。不指定字段是一种非常糟糕的做法,因为数据必须按特定顺序排列。@rr-我必须对此进行研究。这正是我所需要的,是的,INSERT语句是相同的。谢谢分享。我会让你知道我的结果!这是一种比我的建议更好的做法。如果可以的话,请使用这个。@rr-谢谢你非常感谢你的帮助。注意:实际上,我在使用mysqli或PDO(实际上是在你的建议中提出的)之间有点犹豫,但很快就会做出决定。再次感谢,反应非常好!当然,两者非常相似。主要区别在于PDO为数据访问提供了一个抽象层(因此,在数据库驱动程序之间切换很容易)而且可以说更“标准化”,但这对于小型应用程序来说并不重要
$queryInsert = '';
$total = count($value1Array);
while ($i < $total) {
    $queryInsert .= "('$value1Array[$i]','$value2Array[$i]','$value3Array[$i],...), ";
    ++$i;
}
$queryString = $queryString.$queryInsert;