PHP“SHOW TABLES”MySQLi查询不起作用

时间:2013-04-04 15:18:09

标签: php mysqli prepared-statement

我正在尝试用php执行准备好的语句,但它不起作用。我准备好的陈述如下:

SHOW TABLES LIKE "italy_turin_mathematics"

我这样做:

if ($stmt = $this->mysqli->prepare("SHOW TABLES LIKE ?_?_?")) {


    $stmt->bind_param('sss', "italy", "turin", "mathematics");

    $stmt->execute();

    $stmt->store_result();
    $stmt->bind_result($column1);

    while($stmt->fetch()) {
        echo "Table: ".$column1;
    }

}

我确定它必须返回一些东西,因为PHPMyAdmin确实如此,但是使用PHP它总是跳过while循环,我认为准备好的语句查询有问题,也许它需要转义下划线字符?

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您的数据库架构完全错误

应该有只有一个表包含所有地点和科学的所有数据。
而且你必须按常规方式查询,而不使用SHOW TABLES

所以,它必须像

$sql = "SELECT * FROM t WHERE country=? AND city=? and science=?";
$stm = $pdo->prepare($sql);
$stm->execute(array("italy", "turin", "mathematics"));
$data = $stm->fetchAll();

上面的代码在PDO中,因为你必须使用它而不是mysqli。

拆分表是一个非常糟糕的主意,违反了关系数据库的基本规则。正如您所看到的,它会让您运行这样一个奇怪的查询,并会使您的进一步代码变得更糟。

答案 1 :(得分:0)

if ($stmt = $this->mysqli->prepare("SHOW TABLES LIKE ?")) {

    $country = "italy";
    $city = "turin";
    $course = "mathematics";

    $stmt->bind_param('s', $country . "_" . $city . "_" . $course);

    $stmt->execute();

    $stmt->store_result();
    $stmt->bind_result($column1);

    while($stmt->fetch()) {
        echo "Table: ".$column1;
    }

}

据我所知,你所拥有的代码会导致查询如下:

SHOW TABLES LIKE 'italy'_'turin'_'mathematics'

答案 2 :(得分:0)

你无法在mySQL或我能想到的任何形式的SQL中进行连接。

SHOW TABLES LIKE ?_?_?

应该是:

SHOW TABLES LIKE CONCAT(?, '_', ?, '_', ?) --this gives an error, see below

我完全同意@ your-common-sense的评论,这是一种设计数据库的可怕的方式,你会以更多的方式后悔它,而不仅仅是这个混乱的查询。

编辑:

MySQL似乎不允许SHOW TABLES语句中的函数,因此要么必须将表名连接到PHP中的单个字符串,要么可以使用如下查询:

SELECT 
  TABLE_NAME
FROM    
  INFORMATION_SCHEMA.TABLES    
WHERE    
  table_schema = 'mydb' AND    
  table_name LIKE CONCAT(?, '_', ?, '_', ?);