PHP - SQL 语句中的多个变量用法

PHP - multiple variable usages in SQL statement

我有一个项目,我要使用 PHP 和 HTML 表单将大型 CSV 文件(200 个字段)上传到数据库中。在一些帮助下,我终于让它工作了,它将所有 200 个字段提交到 MySQL workbench 中的一个阶段 table,这是我最大的障碍。我已将我的代码设置为拆分元素,将一些放在一个 table 中,将一些放在另一个中,最多 7 个 table。我目前的问题是我们有一些重复。即 'meters' table 和 'costs' table 有很多相同的变量。我在 PHP 中创建了一个列数组,列出了所有 200 个变量,并为每个数据库 table 创建了 7 个 table 数组。如果我注释掉除 'staging' table 之外的所有内容(每个变量仅使用一次),它会正常提交并且我可以在 MySQL WB 中看到数据。但是,当我删除所有 7 个 table 的注释和 运行 语句(多次使用某些变量)时,不会插入任何内容。 运行 PHP 中的 SQL 语句不可能插入到多个 table 中,尤其是多次使用变量吗?

代码示例:

$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
$filesop = fgetcsv($handle, 0, ",");

$coldata = array();

$coldata['orderNumber'] = $filesop[0];
$coldata['place'] = $filesop[1];
$coldata['workOrderNum'] = $filesop[2];
$coldata['lowSideMIUNum'] = $filesop[3];
$coldata['highSideMIUNum'] = $filesop[4];
$coldata['accountNum'] = $filesop[5];
$coldata['custName'] = $filesop[6];
$coldata['address'] = $filesop[7];

$table_cols = array();

/*staging*/
$table_cols[0] = 'orderNumber,place,workOrderNum,lowSideMIUNum,highSideMIUNum'
/*clients*/
$table_cols[1] ="orderNumber,place,workOrderNum,lowSideMIUNum"
/*meters*/
$table_cols[2] ="workOrderNum,lowSideMIUNum,highSideMIUNum,accountNum"


$tablenames = array("staging","clients","meters");

for($tableno = 0;$tableno < sizeof($tablenames);$tableno++){
$q = "";
$col_list = '`'.str_replace(',','`,`',$table_cols[$tableno]).'`';
$q .= "INSERT INTO ".$tablenames[$tableno]." (".$col_list.") VALUES (";
$cols = explode(",",$table_cols[$tableno]);
$data = array();
foreach($cols as $key => $fldname) {
    $data[] = "'".$coldata[$fldname]."'";
}

$q .= implode(",",$data).");";

echo "<p>$q:<pre>".print_r($q,true)."</pre></p>\n";
}
if(mysqli_query($connect, $q)) { echo'File submitted'; } else { /*var_dump($q)*/echo "Error: " . mysqli_error($connect); }

您不能使用 mysqli_query 运行 整批查询。 尝试 mysqli_multi_query()

我有一个其他人发现有用的可靠代码块:Strict Standards: mysqli_next_result() error with mysqli_multi_query

针对您的情况:

if(mysqli_multi_query($connect,$q)){
    do{
        $cumulative_rows+=mysqli_affected_rows($connect);
    } while(mysqli_more_results($connect) && mysqli_next_result($connect));
}
if($error_mess=mysqli_error($connect)){
    echo "Syntax Error: $error_mess";
}elseif($cumulative_rows!=sizeof($tablenames)){
    echo "Logic Error";
}

如果您想对您的查询进行个性化 success/failure 反馈,请参阅我上面的 link 以了解有关将您的查询声明为数组元素并回显结果的说明。

请尝试-

$file = $_FILES[ "file" ][ "tmp_name" ];
$handle = fopen( $file,
                 "r" );
$filesop = fgetcsv( $handle,
                    0,
                    ",");

$coldata = array();

$coldata[ "orderNumber" ] = $filesop[ 0 ];
$coldata[ "place" ] = $filesop[ 1 ];
$coldata[ "workOrderNum" ] = $filesop[ 2 ];
$coldata[ "lowSideMIUNum" ] = $filesop[ 3 ];
$coldata[ "highSideMIUNum" ] = $filesop[ 4 ];
$coldata[ "accountNum" ] = $filesop[ 5 ];
$coldata[ "custName" ] = $filesop[ 6 ];
$coldata[ "address" ] = $filesop[ 7 ];

$table_cols = array();

/*staging*/
$table_cols[ 0 ] = "orderNumber, place, workOrderNum, lowSideMIUNum, highSideMIUNum";
/*clients*/
$table_cols[ 1 ] = "orderNumber, place, workOrderNum, lowSideMIUNum";
/*meters*/
$table_cols[ 2 ] = "workOrderNum, lowSideMIUNum, highSideMIUNum, accountNum";


$tablenames = array( "staging",
                     "clients",
                     "meters" );

for( $tableno = 0;
     $tableno < sizeof( $tablenames );
     $tableno++ )
{
    $q = "";

    $col_list = "'".
                  str_replace( ", ",
                               "', '",
                               $table_cols[ $tableno ] ).
                  "'";

    $cols = explode( ", ",
                     $table_cols[ $tableno ] );

    $q .= "INSERT INTO " .
          $tablenames[ $tableno ] .
          " ( " .
          $col_list .
          " ) VALUES ( ";

    $data = array();
    foreach ( $cols as $key => $fldname )
    {
        $data[] = "'".
                  $coldata[ $fldname ] .
                  "'";
    }

    $q .= implode( ", ",
                   $data ) .
                   ");";

    echo "<p>$q:<pre>" .
         print_r( $q,
                  true ) .
         "</pre></p>\n";
}

if ( mysqli_multi_query( $connect,
                         $q ) )
{
    echo "File submitted";
}
else
{
    /*var_dump( $q )*/
    echo "Error : " .
         mysqli_error( $connect );
}

注意 1:我已将布局更改为我认为更易于调试的布局,但它不会对您的程序的 运行 产生影响。

注意 2:我已经整理了您在使用现在或即将成为 MySQL 代码时对“'s, ' 和 `'s, which was a little inconsistent across your code. I recommend using " when working with PHP code and using ' 的用法。` 不是在您的代码上下文中调用。

注意 3:请继续阅读 mysqli_query and mysqli_multi_query - 后者可用于执行一批以上的 SQL 语句。

注意 4 : 我在你的 $table_cols 定义的末尾添加了分号。

如果您或其他查看此内容的人有任何问题或意见,请随时post发表相应的评论。