Skip to content

数据库

在热铁盒网页托管,我们提供了 KV 数据库,您可以通过云函数来读写它。

创建数据库

您可以使用云函数内置的 Database 类来创建或打开一个数据库实例,只需传入数据库的名称作为参数即可。一个网站可以创建多个数据库,创建的数据库只能被当前网站访问。

php
<?php
$db = new Database("database_name");
js
const db = new Database("database_name");

命名规则

数据库和键的名称只能包含字母、数字、下划线 _ 和连字符 -,且区分大小写。

读取数据

您可以使用 get 方法读取指定键的数据。

php
<?php
$db = new Database("database_name");
$data = db->get("key_name");
echo $data;
js
// 在 Node.js 中,`get` 方法是异步的,因此需要使用 `await` 关键字。
// 我们建议将其放在异步函数中,但如果您想在顶层使用,也可以使用 `.then()`。

async function main() {
	const db = new Database("database_name");
	const data = await db.get("key_name");
	document.write(data);
}

main();

写入数据

您可以使用 set 方法写入指定键的值。写入的值只能是字符串类型,长度不超过 65535 个字符。如需存储其他数据类型,您可以先将其转为字符串。

php
<?php
$db = new Database("database_name");
$db->set("key_name", "value");
js
const db = new Database("database_name");
db.set("key_name", "value");

写入和删除等修改数据库的操作是同步的,不需要 await

删除数据

您可以使用 delete 方法删除指定键的值。

php
<?php
$db = new Database("database_name");
$db->delete("key_name");
js
const db = new Database("database_name");
db.delete("key_name");

列出所有键

您可以使用 listKeys 方法获取数据库中的所有键名。该方法返回一个键名数组。

php
<?php
$db = new Database("database_name");
$keys = $db->list_keys();
echo implode("<br>", $keys);
js
async function main() {
	const db = new Database("database_name");
	const keys = await db.listKeys();
	document.write(keys);
}

main();

数组

set 方法会覆盖指定键已有的值。如果你想在同一个键里放多个值,可以用 push 方法把新值加进去。使用 getArray 方法可以读取这个键下的所有值,返回一个数组。

如果您想删除数组中的某个值,可以使用 delete(key, value) 方法。

请注意

数组的读写效率不如单个值,请优先使用单个值存储,不要滥用数组。

php
<?php
$db = new Database("database_name");
$db->push("key_name", "value1");
$db->push("key_name", "value2");

echo "添加两个值后:<br>";
$values = $db->get_array("key_name");
echo implode("<br>", $values);
echo "<br>";

$db->delete("key_name", "value1");

echo "删除 value1 后:<br>";
$values = $db->get_array("key_name");
echo implode("<br>", $values);

$db->delete("key_name");  // 删除整个数组
js
async function main() {
	const db = new Database("database_name");
	db.push("key_name", "value1");
	db.push("key_name", "value2");

	document.write("添加两个值后:<br>");
	let values = await db.getArray("key_name");
	document.write(values);
	document.write("<br>");

	db.delete("key_name", "value1");

	document.write("删除 value1 后:<br>");
	values = await db.getArray("key_name");
	document.write(values);

	db.delete("key_name");  // 删除整个数组
}

main();

完整示例

以下是一个简单的示例,演示如何使用 KV 数据库统计每个名字访问的次数。

php
<?php
$db = new Database("visits");

if (isset($_GET["name"])) {
	$name = $_GET["name"];  // 从网址参数中获取名字
	$count = 0;
	$data = $db->get($name);  // 读取数据库
	if ($data !== null) {
		$count = intval($data);  // 将数据库里存的字符串转换为数字
	}
	$count++;  // 访问次数加 1
	$db->set($name, strval($count));  // 写入数据库
}
?>

<!DOCTYPE html>
<html>
	<head>
		<title>统计</title>
	</head>
	<body>
		<?php
		if (isset($_GET["name"])) {
			echo "<p>欢迎," . htmlspecialchars($name) . "!您访问了本站 $count 次。</p>";
		}
		?>
		<form>
			<label for="name">名字:</label>
			<input type="text" id="name" name="name">
			<input type="submit" />
		</form>
	</body>
</html>
js
async function main() {
	const db = new Database("visits");

	const visitor = req.query.name;  // 从网址参数中获取名字
	let count = 0;
	if (visitor) {
		const data = await db.get(visitor);  // 读取数据库
		if (data) {
			count = parseInt(data);  // 将数据库里存的字符串转换为数字
		}
		count++;  // 访问次数加 1
		db.set(visitor, count.toString());  // 写入数据库
	}

	document.write(`
		<!DOCTYPE html>
		<html>
			<head>
				<title>统计</title>
			</head>
			<body>
				${visitor ? `<p>欢迎,${visitor}!您访问了本站 ${count} 次。</p>` : ""}
				<form>
					<label for="name">名字:</label>
					<input type="text" id="name" name="name">
					<input type="submit" />
				</form>
			</body>
		</html>
	`);
}

main();

第三方 SQL 数据库

热铁盒网页托管的 PHP 支持连接到第三方 SQL 数据库,例如阿里云 RDS。如果您在第三方平台上创建数据库并打算在热铁盒网页托管中调用,建议选择位于美国西部的数据库实例以获得最低的网络延迟。