我正在尝试用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循环,我认为准备好的语句查询有问题,也许它需要转义下划线字符?
我该怎么做?
答案 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(?, '_', ?, '_', ?);