【问题标题】:how to concatenate sql queries如何连接sql查询
【发布时间】:2013-01-28 21:24:57
【问题描述】:

我正在尝试连接 sql 查询并在循环后运行。这怎么可能?这是我的愿景:

for($i=1;$i<=10;$i++){
   $item_.$i = "value_".$i;
   sql = sql . " insert into table (`item`) values ('$item_'.$i.'')";
   // this should be but an array
}

并保存到数据库中:

for($j=0;$j<sqlarray.length;$j++){
   $sql_done = mysql_query($sqlarray[$j]);
}

我还没有尝试任何东西,因为数据库很大,我害怕用我的代码破坏一些重要的东西..

非常感谢

【问题讨论】:

  • 您可以在 sql 字符串上使用 echo 而不是 mysql_query 进行调试 - 这样您就可以首先检查插入是否合理,而无需实际执行它们。
  • mysql_query 不允许多查询,但是anyway you should not use the mysql_ functions anymore.
  • @fab,我没有使用mysql_query 插入多个查询,我多次使用mysql_query。没关系。
  • 我明白了。那你为什么要连接它们而不是把它们放到一个数组中呢?
  • @fab,是的,这就是线索:D,现在我做到了。谢谢老兄

标签: php mysql for-loop


【解决方案1】:

试试下面的代码

 $sql="":
 for($i=1;$i<=10;$i++)
{
 $item_.$i = "value_".$i;
 $sql.=" insert into table (`item`) values ('$item_'.$i.'')";

  // this should be but an array
 }

 mysql_query($sql);

【讨论】:

  • $sql 是数组吗?你确定吗?
  • @doniyor 没有。 $sql 不是数组。它是一个变量。其中包含所有插入查询。试试上面的代码。它会工作的。我也在我的一些项目中应用了它。
  • 我不认为你的代码会工作。因为你在语句中有多个insert into's
  • 是的。只需在 phpmyadmin 中尝试一次。请告诉我。
【解决方案2】:

对于插入查询,您可以编写如下代码:

$sql .= " insert into table (`item`) values ";
for($i=1;$i<=10;$i++){
   $item_.$i = "value_".$i;
   $sql = $sql . " ('$item_'.$i.''),";

}
mysqli_query( substr($sql ,0,-1) );

上面会将所有插入数据连接到一个字符串中并立即执行。

【讨论】:

  • 有一个错字:$sql = sql 应该是$sql = $sql
  • 为什么是substr?删除最后一个, ?
  • substr 是去掉最后一个连接字符串中的,(逗号)
【解决方案3】:

我希望你正在寻找这个

$query = "insert into table_name values";
for($i=0;$i<4;$i++) {
    $data1 = "test_".$i;
    $data2 = "new_".$i;
    $query .= "('','$data1','$data2'),";
}
$query = substr($query,0,-1);

echo $query;

告诉我

【讨论】:

    【解决方案4】:

    使用 mysqli 和绑定

    http://www.php.net/manual/en/mysqli.prepare.php

    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    // define your query
    $query = "INSERT INTO tablename (column1,column2) VALUES (:col1,:col2)";
    if ($stmt = $mysqli->prepare($query)) {
      // loop of insert
      for($i=0;$i<10;$i++){
        $stmt->bind_param("col1", $i);
        $stmt->bind_param("col2", 'test'.$i);
        $stmt->execute();
      }
      $stmt->close();
    }else{
      throw new Exception("unable to prepare query");
    }
    $mysqli->close();
    

    绑定会避免很多安全问题,任何人都不应该使用其他东西然后绑定。

    最好把所有东西都放在一个事务中,万一发生错误,你的数据库保持不变。

    请参阅:http://www.php.net/manual/en/mysqli.commit.php 了解更多信息

    这是一个带有提交或回滚的提案

    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    if (mysqli_connect_errno()) {
      throw new Exception("Unable to connect");
    }else{
      try{
        $mysqli->autocommit(FALSE);
        // define your query
        $query = "INSERT INTO tablename (column1,column2) VALUES (:col1,:col2)";
        if ($stmt = $mysqli->prepare($query)) {
          // loop of insert
          for($i=0;$i<10;$i++){
            $stmt->bind_param("col1", $i);
            $stmt->bind_param("col2", 'test'.$i);
            $stmt->execute();
          }
          $stmt->close();
        }else{
          throw new Exception("unable to prepare query");
        }
        $mysqli->commit();
      }catch(Exception $e){
        $mysqli->rollback();
      }
      $mysqli->close();
    }
    

    我没有尝试过,但我们应该接近一个好的(最佳实践?)解决方案。

    希望对你有帮助。

    【讨论】:

    • +1 是一种很好的做法,但是我相信 OP 希望为每个插入(循环进入的地方)的 10 个字段使用 10 个值,而不是插入 10 条记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多