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发表相应的评论。
我有一个项目,我要使用 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发表相应的评论。