在本部分中,先在 wishlist.php 中添加代码以创建数据库连接。然后,添加代码以检索在 index.php 窗体中键入其名字的许愿者的 ID 号。
双击 wishlist.php 文件。打开的模板与 index.php 不同。该文件以 和
标记开头和结尾,因为该文件还包含 HTML 代码。// put your code here
?>
要显示标题,请在紧靠起始
标记后面以及生成的 <?php 标记前面的位置输入以下代码块:Wish List of <?php echo htmlentities($_GET["user"])."
";?>
现在,代码如下所示:
Wish List of <?php echo htmlentities($_GET["user"])."
"; ?>
// put your code here
?>
PHP 代码块显示通过 "user" 字段中的 GET 方法接收的数据。在 "user" 文本字段中输入愿望列表所有者 Tom 的名字时,将从 index.php 中传输该数据。重复测试 index.php 中的步骤,以查看 wishlist.php 是否正常工作。
在模板 PHP 块中删除注释部分。在该位置键入或粘贴以下代码。该代码打开数据库连接。
对于 MySQL 数据库:
$con = mysqli_connect("localhost", "phpuser", "phpuserpw");
if (!$con) {
exit('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}
//set the default client character
set mysqli_set_charset($con, 'utf-8');
对于 Oracle 数据库:
$con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
if (!$con) {
$m = oci_error();
exit('Connect Error ' . $m['message']);
}
该代码尝试打开数据库连接;如果失败,则会显示一条错误消息。
*Oracle 数据库用户注意事项:*您可能需要在 oci_connect 命令中修改数据库连接。标准语法为 "hostname/service name"。按照该语法,此代码片段中的 Oracle XE 数据库连接是 "localhost/XE"。
您可以使用 NetBeans IDE 的代码完成功能完成 mysqli 或 OCI8 函数。
在打开数据库连接的代码下面,在同一 PHP 块中键入或粘贴以下代码。该代码检索请求其愿望列表的许愿者的 ID。如果许愿者不在数据库中,代码将终止/退出该进程,然后显示一条错误消息。
对于 MySQL 数据库:
mysqli_select_db($con, "wishlist");
$user = mysqli_real_escape_string($con, htmlentities($_GET["user"]));
$wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'");
if (mysqli_num_rows($wisher) < 1) {
exit("The person " . htmlentities($_GET["user"]) . " is not found. Please check the spelling and try again");
}
$row = mysqli_fetch_row($wisher);
$wisherID = $row[0];
mysqli_free_result($wisher);
对于 Oracle 数据库:(请注意,oci8 没有等效的 mysqli_num_rows )
$query = "SELECT id FROM wishers WHERE NAME = :user_bv";
$stid = oci_parse($con, $query);
$user = $_GET['user'];
oci_bind_by_name($stid, ':user_bv', $user);
oci_execute($stid);
//Because user is a unique value I only expect one row
$row = oci_fetch_array($stid, OCI_ASSOC);
if (!$row) {
exit("The person " . $user . " is not found. Please check the spelling and try again" );
}
$wisherID = $row['ID'];
oci_free_statement($stid);
将通过 $con 连接从 wishlist 数据库中选择数据。选择条件是从 index.php 中作为 "user" 接收的名字。
``SELECT`` SQL 语句的语法可以简述如下:
在 SELECT 后面,指定要从中获取数据的字段。星号 (*) 表示所有字段。
在 FROM 子句后面,指定必须从中检索数据的表的名称。
WHERE 子句是可选的。将在其中指定过滤条件。
mysqli 查询返回结果对象。OCI8 返回执行的语句。在这两种情况下,将从执行的查询结果中获取一行,并提取 ID 行的值以将其存储在 $wisherID 变量中。
最后,释放 mysqli 结果或 OCI8 语句。在实际关闭连接之前,您需要释放使用该连接的所有资源。否则,PHP 的内部引用计数系统会让基本 DB 连接保持打开,即使 $con 在 mysqli_close() 或 oci_close() 调用后无法使用。
*安全注意事项:*对于 MySQL,将转义 htmlentities($_GET["user"]) 参数以防止 SQL 注入攻击。请参见有关 SQL 注入的维基百科和 mysql_real_escape_string 文档。虽然在本教程的上下文中,您不会遇到有害 SQL 注入的风险,但最佳做法是转义存在此类攻击风险的 MySQL 查询中的字符串。OCI8 是通过绑定变量避免的。
此 PHP 块现已完成。如果使用的是 MySQL 数据库,则会看到 wishlist.php 文件现在如下所示:
Wish List of <?php echo htmlentities($_GET["user"]) . "
"; ?><?php $con = mysqli_connect("localhost", "phpuser", "phpuserpw");
if (!$con) {
exit('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}//set the default client character set
mysqli_set_charset($con, 'utf-8');
mysqli_select_db($con, "wishlist");
$user = mysqli_real_escape_string($con, htmlentities($_GET["user"]));
$wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'");
if (mysqli_num_rows($wisher) < 1) {
exit("The person " . htmlentities($_GET["user"]) . " is not found. Please check the spelling and try again");
}
$row = mysqli_fetch_row($wisher);
$wisherID = $row[0];
mysqli_free_result($wisher);
?>
如果使用的是 Oracle 数据库,则会看到 wishlist.php 文件现在如下所示:
Wish List of <?php echo htmlentities($_GET["user"]) . "
"; ?>
$con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
if (!$con) {
$m = oci_error();
exit('Connect Error ' . $m['message'];
exit;
}
$query = "SELECT id FROM wishers WHERE name = :user_bv";
$stid = oci_parse($con, $query);
$user = htmlentities($_GET["user"]);
oci_bind_by_name($stid, ':user_bv', $user);
oci_execute($stid);//Because user is a unique value I only expect one row
$row = oci_fetch_array($stid, OCI_ASSOC);
if (!$row) {
exit("The person " . $user . " is not found. Please check the spelling and try again" );
}
$wisherID = $row["ID"];
oci_free_statement($stid);
?>
如果测试应用程序并输入无效的用户,则会显示以下消息。