昨天有一个读者通过邮件问了类似问题。以下是作者给出的解决方案。你可以参考一下。
书中16-2代码如下:
<?php
// 定义数据库信息
define( "DATABASE_SERVER", "127.0.0.1" );
define( "DATABASE_USERNAME", "root" );
define( "DATABASE_PASSWORD", "" );
define( "DATABASE_NAME", "sample" );
// 连接数据库
$mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD);
mysql_select_db( DATABASE_NAME );
// quote_smart函数,给变量加引号保证安全
function quote_smart($value)
{
// 使用Stripslashes去掉反斜线字符
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 判断数字类型
if (!is_numeric($value))
{
// mysql_real_escape_string 函数转义 SQL 语句中使用的字符串中的特殊字符
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
if( $_POST["email"] AND $_POST["username"])
{
// 添加用户
$Query = sprintf("INSERT INTO users VALUES ('', %s, %s)",
quote_smart($_POST['username']), quote_smart($_POST['email']));
$Result = mysql_query( $Query );
}
// 返回所有用户列表
$Query = "SELECT * from users";
$Result = mysql_query( $Query );
$Return = "<users>";
while ( $User = mysql_fetch_object( $Result ) )
{
$Return .= "<user><userid>".$User->userid."</userid><username>".
$User->username."</username><email>".
$User->email."</email></user>";
}
$Return .= "</users>";
mysql_free_result( $Result );
print ($Return)
?>
在这段代码中,读者可能比较疑惑的是 quote_smart 函数。
quote_smart函数的主要作用是代码的安全性。因为在网页中,经常会有黑客通过SQL语句的注入性代码或者字符攻击网站,为了验证用户输入的用户名和邮箱等信息的不是非法字符,就需要验证用户输入的信息,并处理非法字符串。
get_magic_quotes_gpc()函数是PHP内置的函数,这个函数的作用就是得到php.ini设置中magic_quotes_gpc选项的值。如果magic_quotes_gpc=On,PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“\”,
以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
如果程序不能编译通过,可以试图把下面的代码:
// 添加用户
$Query = sprintf("INSERT INTO users VALUES ('', %s, %s)",
quote_smart($_POST['username']), quote_smart($_POST['email']));
去掉quote_smart函数,修改后的代码如下:
$Query = sprintf("INSERT INTO users VALUES ('', %s, %s)",
$_POST['username'], $_POST['email']);
其他的代码都相对简单。
mysql_fetch_object() 函数从结果集(记录集)中取得一行作为对象。
mysql_free_result() 将释放所有与结果标识符result 所关联的内存。
此段PHP代码的主要意图是把从数据库读出的结果,以XML的格式输出出来。主要的方法是字符串的拼接。实现的方式有很多种,具体可以参见PHP的XML和WebService相关知识。 |