【问题标题】:Can't execute multi-statement SQL through PHP code [duplicate]SQL语句在phpmyadmin中有效,但在使用mysqli时无效[重复]
【发布时间】:2014-11-21 06:42:09
【问题描述】:

我肯定错过了一些东西。 如果粘贴在 phpmyadmin 中,下面使用的 SQL 代码就可以正常工作。 但是一旦我在自定义 PHP 代码中使用它,它就会引发异常:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近'CREATE TABLE v2_session(用户名varchar(150)DEFAULT'',时间 varchar(1' 在第 2 行

我错过了什么,代码非常简单,我现在很困惑。 这是我的 PHP 代码:

$con=mysqli_connect("host","user","password","db");

if (mysqli_connect_errno()) {
  echo "Error: " . mysqli_connect_error();
}

    $sql="
    DROP TABLE IF EXISTS v2_session;
    CREATE TABLE v2_session (
      username varchar(150) DEFAULT '',
      time varchar(14) DEFAULT '',
      session_id varchar(200) NOT NULL DEFAULT '0',
      guest tinyint(4) DEFAULT '1',
      userid int(11) DEFAULT '0',
      usertype varchar(50) DEFAULT '',
      gid tinyint(3) unsigned NOT NULL DEFAULT '0',
      client_id tinyint(3) unsigned NOT NULL DEFAULT '0',
      data longtext,
      PRIMARY KEY (session_id(64)),
      KEY whosonline (guest,usertype),
      KEY userid (userid),
      KEY time (time)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;";

if (mysqli_query($con,$sql)) {
  echo 'Success!';
} else {
  echo "Error: " . mysqli_error($con);
}

mysqli_close($con);

【问题讨论】:

  • 如果从上面删除DROP TABLE IF EXISTS v2_session; 会怎样?
  • 多个语句必须使用Mysqli Multi Query
  • 是的,你们都在正确的轨道上。如此愚蠢的问题,感谢您的快速帮助!

标签: php mysql sql mysqli phpmyadmin


【解决方案1】:

这是两条语句,应分别执行:

$sql = "DROP TABLE IF EXISTS v2_session";
if (!mysqli_query($con,$sql)) {
   echo "Error: " . mysqli_error($con);
   exit(1);
}

$sql="
CREATE TABLE v2_session (
  username varchar(150) DEFAULT '',
  time varchar(14) DEFAULT '',
  session_id varchar(200) NOT NULL DEFAULT '0',
  guest tinyint(4) DEFAULT '1',
  userid int(11) DEFAULT '0',
  usertype varchar(50) DEFAULT '',
  gid tinyint(3) unsigned NOT NULL DEFAULT '0',
  client_id tinyint(3) unsigned NOT NULL DEFAULT '0',
  data longtext,
  PRIMARY KEY (session_id(64)),
  KEY whosonline (guest,usertype),
  KEY userid (userid),
  KEY time (time)
) ENGINE=MyISAM DEFAULT CHARSET=utf8";

if (mysqli_query($con,$sql)) {
  echo 'Success!';
} else {
  echo "Error: " . mysqli_error($con);
}

【讨论】:

    【解决方案2】:

    mysqli_query 不允许使用分号连接多个语句。

    要么将查询拆分为两个单独的查询,要么使用 mysqli_multi_query() 和非常相似的语法。

    bool mysqli_multi_query (mysqli $link, string $query)

    执行一个或多个用分号连接的查询。

    mysqli_multi_query 的缺点是它使您的代码对 SQL 注入更加敏感(因为可以注入整个语句),但对于没有参数的静态查询,它应该不会导致任何问题。

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 2019-02-06
      • 2014-10-31
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多