Php mysqli_查询返回false,因为值包含空格字符

Php mysqli_查询返回false,因为值包含空格字符,php,mysql,Php,Mysql,我正在从excel工作表插入数据,但收到错误,它看起来像是在中断,因为该值之间包含空格字符。据我记忆所及,VARCHAR(200) 这是我正在使用的代码 //CREATE SQL QUERY FOR INSERTING DATA IN DATABASE $sql = "INSERT INTO ".$month."_".$year."("; foreach($sheetData[1] as $columnName){ $sql .= preg_replace('#[

我正在从excel工作表插入数据,但收到错误,它看起来像是在中断,因为该值之间包含空格字符。据我记忆所及,
VARCHAR(200)

这是我正在使用的代码

//CREATE SQL QUERY FOR INSERTING DATA IN DATABASE
    $sql = "INSERT INTO ".$month."_".$year."(";
    foreach($sheetData[1] as $columnName){
        $sql .= preg_replace('#[ ]#', '_',$columnName). ",";
    }
    $sql = rtrim($sql, ',');//REMOVES COMMA FROM END OF THE STRING
    $sql .= ")";
    //
    $sql .= " VALUES((";
    for($i=2;$i < count($sheetData);$i++){
        foreach($sheetData[$i] as $columnName){
            $sql .= $columnName.",";
        }
        $sql = rtrim($sql,',');//
        $sql .= "),";
    }
    $sql = rtrim($sql,',');//
    $sql .= ")";
    echo $sql;
    $query = mysqli_query($conn,$sql) or die(mysqli_error($conn));
您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第1行“Santhoshi Enterprise,TG000999,Sree Laxmi Mobiles,A,F4,anthem Arcade,gujarathi G”附近使用的正确语法

上面写着“三合市企业…”之前有一个空格字符

您有两个“(“值”后面不是一个,
您刚才不是问了一个问题吗?关于相同/相似的代码,但有不同的错误,请访问:

从总体上看,你写的代码乱七八糟,阅读/理解错误信息有困难。所以我猜你是新手

这里有一些好的读物给你:

说了这么多,做了这么多,下面是您的代码分解为更可读的部分:

// prepare dummy data
$month = date('M');
$year = date('Y');
$sheetData = array(
    array('data00', 'data01')
    ,array('col1', 'col2', 'col3', 'col4', 'col5', 'col6')
    ,array('data20', "data21")
    ,array('data30', 'data31')
    ,array('data40', 'data41')
);

// prepare vars
$tableName = "{$month}_{$year}";
$dataCount = count($sheetData);

// prepare columns
$columnsSQL = "";
foreach ($sheetData[1] as $columnName) {
    // wrap with ` ticks
    $columnsSQL .= '`'. preg_replace('#[ ]#', '_', $columnName).'`'.',';
}
$columnsSQL = rtrim($columnsSQL, ',');

// prepare values
$valuesSQL = "";
for ($i=2;$i < $dataCount;$i++) {
    foreach($sheetData[$i] as $columnValue){
        $valuesSQL .= "'{$columnValue}', ";
    }
}
$valuesSQL = rtrim($valuesSQL, ', ');

$SQL = "
INSERT INTO {$tableName}( {$columnsSQL} )
VALUES ( {$valuesSQL} )";
其他注意事项和提示:

  • 考虑到你说你正在从excel工作表中读取数据……在没有一些测试/检查/验证的情况下,千万不要相信输入数据。这不仅仅是因为安全性,也是因为稳定性,一般来说,你不希望事情破裂。 那些excel表格可以手工制作,这意味着它很容易出现人为错误,所以你不能总是100%确定你会得到什么

  • 考虑使用PDO和准备好的语句(出于安全原因,但也是良好实践)


您的varchar值周围有单引号吗?为什么要使用月份和年份作为表名,而不是将它们作为常规表中的列?您需要将插入到表中的任何字符串值用引号括起来。最好使用单表,按年份和月份进行分区,并显式指定列,而不是而不是依赖于电子表格中的语句是正确的。您还应该使用一个准备好的语句,而不是动态SQL;即使您不担心SQL注入,准备好的语句也会提供一个“Bozo过滤器”针对工作表中格式错误的值,并将自动处理字符串值的正确引用。是的,在发布此问题后,引号问题才得以解决。我正在使用月份-年份创建表名,因为每个月我都会收到带有新列/行的新数据。我的客户端将每月上载一份excel工作表,其中包含整个月要做什么
// prepare dummy data
$month = date('M');
$year = date('Y');
$sheetData = array(
    array('data00', 'data01')
    ,array('col1', 'col2', 'col3', 'col4', 'col5', 'col6')
    ,array('data20', "data21")
    ,array('data30', 'data31')
    ,array('data40', 'data41')
);

// prepare vars
$tableName = "{$month}_{$year}";
$dataCount = count($sheetData);

// prepare columns
$columnsSQL = "";
foreach ($sheetData[1] as $columnName) {
    // wrap with ` ticks
    $columnsSQL .= '`'. preg_replace('#[ ]#', '_', $columnName).'`'.',';
}
$columnsSQL = rtrim($columnsSQL, ',');

// prepare values
$valuesSQL = "";
for ($i=2;$i < $dataCount;$i++) {
    foreach($sheetData[$i] as $columnValue){
        $valuesSQL .= "'{$columnValue}', ";
    }
}
$valuesSQL = rtrim($valuesSQL, ', ');

$SQL = "
INSERT INTO {$tableName}( {$columnsSQL} )
VALUES ( {$valuesSQL} )";
INSERT INTO Nov_2015( `col1`,`col2`,`col3`,`col4`,`col5`,`col6` )
VALUES ( 'data20', 'data21', 'data30', 'data31', 'data40', 'data41' )