MySQL使用while循环插入多个记录

时间:2015-11-26 04:46:21

标签: php mysql

我有一个简单的HTML表单和一些php变量,如下所示,使用submit方法将书籍详细信息提交到名为Book的MySQL表中。 clcode是一个自动增量字段。

$isbn =$_POST["isbn"]; 
$bno =$_POST["b_no"];
$bname =$_POST["b_name"];
$qty =$_POST["qty"]; 
$price =$_POST["price"]; 

需要根据数量插入记录。例如: - 如果数量= 2, 它需要执行两次插入查询(应插入2个具有自动增量clcodes的相同记录)。如果数量= 5, 它需要执行5次插入查询(应该插入5个带有自动增量clcodes的相同记录)等等...我使用了一个存储过程和以下SQL查询来执行此操作。

$query ="CREATE PROCEDURE myproc()
    BEGIN
    DECLARE i int DEFAULT 0;
    DO
    INSERT INTO book (isbn, b_no, b_name, qty, price) VALUES ('$isbn', '$bno', '$bname', '$qty', '$price');
        SET i = i + 1;
WHILE i < $qty;
    END WHILE;
END";

$result = mysql_query($query) or die ( mysql_error());

但它返回语法错误。我无法理解我的错误。 PLS。谁都可以帮助我......? TNX。

7 个答案:

答案 0 :(得分:3)

创建表格

create table book (
  id int not null auto_increment,
  isbn VARCHAR(20) not null,
  b_no VARCHAR(20) not null,
  b_name VARCHAR(20) not null,
  qty INT not null,
  price decimal(8, 2) not null,
  primary key(id)
);

创建SP

DELIMITER //

CREATE PROCEDURE proc_book (
  IN isbn VARCHAR(20),
  IN no VARCHAR(20),
  IN name VARCHAR(20),
  IN qty INT,
  IN price DECIMAL(8,2)
)
BEGIN
  DECLARE i INT DEFAULT 0;
  WHILE i < qty DO
  INSERT INTO book (isbn, b_no, b_name, qty, price) VALUES (isbn, no, name, qty, price);
  SET i = i + 1;
  END WHILE;
END;

DELIMITER ;

测试SP

call proc_book('978-3-16-148410-0', '1', 'name1', 2, 10.00);

表格中的数据

+----+-------------------+------+--------+-----+-------+
| id | isbn              | b_no | b_name | qty | price |
+----+-------------------+------+--------+-----+-------+
|  1 | 978-3-16-148410-0 | 1    | name1  |   2 | 10.00 |
|  2 | 978-3-16-148410-0 | 1    | name1  |   2 | 10.00 |
+----+-------------------+------+--------+-----+-------+

从PHP调用SP

使用mysqli而不是mysql

<?php 
// input data should be filterd to prevent SQL injection etc.
$isbn  = $_POST["isbn"];
$bno   = $_POST["b_no"];
$bname = $_POST["b_name"];
$qty   = $_POST["qty"];
$price = $_POST["price"];

//connect to database
$connection = mysqli_connect("hostname", "user", "password", "db", "port");

//run the store proc
$sql = "CALL proc_book('" . $isbn . "', '" . $bno . "', '" . $bname . "', " . $qty . ", " . $price . ")";
$result = mysqli_query($connection, $sql) or die("Query fail: " . mysqli_error());
?>

<强>参考

答案 1 :(得分:3)

创建满足您要求的程序是没有意义的。

假设它适用于第一次运行,但是创建过程将在下次运行时显示错误,因为过程已经存在。

您只需要多次运行插入查询,或者使用多个值构建插入查询并运行一次。 以下是我认为你应该做的事情。

1。for($i=0;$i< $qty;$i++){ $sql = "INSERT INTO table_name (field1,field2,fieldn) VALUES ('field-val1','field-val2','field-valn')"; $result = mysql_query($sql) or die ( mysql_error()); } 或接近2

$sql = "INSERT INTO table_name (field1,field2,fieldn) VALUES";

for($i=0;$i< $qty;$i++){
  $sql .= "('val1','val2','valn')";
  if($i < ($qty -1 )){
     $sql .=",";
   }

 }

$ result = mysql_query($ sql)或die(mysql_error());

答案 2 :(得分:0)

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

这就是while循环的语法

例如: -

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE i INT DEFAULT 0;

  WHILE i < $qty  DO
    INSERT INTO book (isbn, b_no, b_name, qty, price) VALUES ('$isbn', '$bno', '$bname', '$qty', '$price');
    SET i = i + 1;
  END WHILE;
END;

试试这个。

答案 3 :(得分:0)

您不希望在查询中CREATE PROCEDURE。你只想INSERT。你应该只是在php中循环执行一个准备好的语句来执行插入。

使用mysqli预备语句阅读PHP文档。

答案 4 :(得分:0)

$count = 0
while($qty >= $count){
    //insertion code goes here...
    $count++
}

答案 5 :(得分:0)

修改你的sql语句:

$query = "DELIMITER $$

    CREATE PROCEDURE myproc() 
    BEGIN DECLARE i integer DEFAULT 0; 
    while (i< ".$qty.") do 
    begin 
    INSERT INTO book (isbn, b_no, b_name, qty, price) VALUES (".$isbn.", ".$bno.", ".$bname.", ".$qty.", ".$price."); SET i = i + 1; end; end while; 
    END $$

    DELIMITER" ;

有关详细信息,请访问:http://www.mysqltutorial.org/stored-procedures-loop.aspx

答案 6 :(得分:0)

SP中有和没有交易的绩效基准。

1。)没有交易。

DELIMITER //

CREATE PROCEDURE proc_book (
    IN isbn VARCHAR(20),
    IN no VARCHAR(20),
    IN name VARCHAR(20),
    IN qty INT,
    IN price DECIMAL(8,2)
)
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < qty DO
    INSERT INTO book (isbn, b_no, b_name, qty, price) VALUES (isbn, no, name, qty, price);
    SET i = i + 1;
    END WHILE;
END;

DELIMITER ;

尝试添加1000个数量(没有交易)

mysql> call proc_book('978-3-16-148410-0', '1', 'name1', 10000, 10.00);
Query OK, 1 row affected (8 min 43.01 sec)

2。)使用交易。

DELIMITER //

CREATE PROCEDURE proc_book (
    IN isbn VARCHAR(20),
    IN no VARCHAR(20),
    IN name VARCHAR(20),
    IN qty INT,
    IN price DECIMAL(8,2)
)
BEGIN

    DECLARE i INT DEFAULT 0;

    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
    END;

    DECLARE EXIT HANDLER FOR SQLWARNING
    BEGIN
        ROLLBACK;
    END;

    START TRANSACTION;

    WHILE i < qty DO
      INSERT INTO book (isbn, b_no, b_name, qty, price) VALUES (isbn, no, name, qty, price);
      SET i = i + 1;
    END WHILE;

    COMMIT;

END;

DELIMITER ;

尝试添加1000个数量(有交易)

call proc_book('978-3-16-148410-0', '1', 'name1', 10000, 10.00);
Query OK, 0 rows affected (0.21 sec)
相关问题