PHP脚本中的SQL语法错误

时间:2014-04-01 04:35:48

标签: php mysql syntax

我在导入和导出时遇到SQL语法问题。

我收到消息说我有语法错误。

我在array_map处理之前使用mysql_query去除斜线(我知道我应该使用mysqli,但这是一次性使用脚本)。

这是我的代码。

CREATE TABLE `jos_jc_api_emailconnector` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`api_service_board` varchar(255) NOT NULL,
`api_email_address` varchar(255) NOT NULL,
`api_emailboard_quickreferral` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

任何人都可以解释为什么这样的东西不会通过mysql_query运行?它可以通过phpMyAdmin正常运行。

更新:

备份查询:

function backup_tables($tables_pull, $sessionName) {
  $db_backup_jc = new Database();
  $db_backup_jc->connectDB_1(); 
  $db_prefix_pull = $db_backup_jc->db_prefix_pull;  
  // Add Table Prefix of Database Tables

   //cycle through
   foreach($tables_pull as $table) {
    $add_prefix = $db_prefix_pull.$table;   
    $result = mysql_query('SELECT * FROM '.$add_prefix);
    $num_fields = mysql_num_fields($result);        
    $return.= 'DROP TABLE IF EXISTS '.$add_prefix.';';
    $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$add_prefix));
    $return.= "\n\n".$row2[1].";\n\n";

    for ($i = 0; $i < $num_fields; $i++) 
    {
        while($row = mysql_fetch_row($result))
        {
            $return.= 'INSERT INTO '.$add_prefix.' VALUES(';
            for($j=0; $j<$num_fields; $j++) 
            {
                $row[$j] = addslashes($row[$j]);
                $row[$j] = str_replace("\n","\\n",$row[$j]);
                if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
                if ($j<($num_fields-1)) { $return.= ','; }
            }
            $return.= ");\n";
        }
    }
    $return.="\n\n\n"; 
}
//save file
$handle = fopen('tmp/db-backup-'.$sessionName.'.sql','w+');
fwrite($handle,$return);
fclose($handle);

}

IMPORT QUERY:

function import_tables($filename_SQL) {
$db_get_prefix_1 = new Database();
$db_get_prefix_1->connectDB_1(); 
$db_prefix_1 = $db_get_prefix_1->db_prefix_pull;    

$db_get_prefix_2 = new Database();
$db_get_prefix_2->connectDB_2(); 
$db_prefix_2 = $db_get_prefix_2->db_prefix_push;

// Temporary variable, used to store current query
$templine = ''; 
$import_jc_SQL = file($filename_SQL);
$import_jc_SQL = array_map('stripslashes', $import_jc_SQL);
$import_jc_SQL = str_replace($db_prefix_1, $db_prefix_2, $import_jc_SQL);
foreach ($import_jc_SQL as $line) {     

    if (substr($line, 0, 2) == '--' || $line == '')
    continue;
    // Add this line to the current segment
    $templine .= $line;
    // If it has a semicolon at the end, it's the end of the query
    if (substr(trim($line), -1, 1) == ';')
    {
        // Perform the query
        //mysql_query($templine, $conn_DB_2) or print('Error performing query' . mysql_error() . '<br />');
        // Reset temp variable to empty
        //$templine = '';
    }
}
mysql_query($templine) or print('Error performing query <br />' . mysql_error() . '<br />');
echo mysql_error();

}

2 个答案:

答案 0 :(得分:0)

您正在逃避函数中的引号。如果不能删除转义,只需先删除它们,因为它们不需要:

`api_emailboard_quickreferral` tinyint(1) NOT NULL DEFAULT 0,

答案 1 :(得分:0)

你正在错误消息中删除斜杠,你会在'\'0\',周围看到'0'额外的斜杠。你可以:

  • 删除单引号,只说default 0而不是default '0'
  • 不要剥斜杠

我建议使用第一个,因为使用'0'使其成为字符串,并且需要另一个内部类型转换才能使其返回int。