echo "You are " . $_GET['1'] . ".<br>n"; echo "Your favorite color is " . $_GET['2'] . ".<br>n"; echo "The airspeed of an unladen swallow is " . $_GET['3'] . ".<br>n";
echo "You are " . filter_var($_GET['1'], FILTER_SANITIZE_STRING) . ".<br>n"; echo "Your favorite color is " . filter_var($_GET['2'], FILTER_SANITIZE_STRING) . ".<br>n"; echo "The airspeed of an unladen swallow is " . filter_var($_GET['3'], FILTER_SANITIZE_STRING) . ".<br>n"; ?>
如您所见,开始使用 filter_var() 函数来清理输入并使其有效并且安全。在这种情况下,使用选项 FILTER_SANITIZE_STRING,该选项将获取输入、删除所有 HTML 标记并选择性地编码或删除特定字符。
由于它将除去 HTML 标记,因此尝试运行 JavaScript 将失败,并且从脚本中获得更适当的结果。
echo "After connecting, we're using (in bytes): ", memory_get_usage(),"n<br>";
for ( $x=0; $x<10; $x++ ) { $sql = "SELECT data FROM leak_test WHERE id='".$x."'"; $result = mysql_query($sql); // The operation // suspected of leaking. echo "After query #$x, we're using (in bytes): ", memory_get_usage(), "n<br>"; mysql_free_result($result); echo "After freeing result $x, we're using (in bytes): ", memory_get_usage(), "n<br>"; }
mysql_close($db); echo "After closing the connection, we're using (in bytes): ", memory_get_usage(), "n<br>"; echo "Peak memory usage for the script (in bytes):". memory_get_peak_usage();
At the start we're using (in bytes): 63216 After connecting, we're using (in bytes): 64436 After query #0, we're using (in bytes): 64760 After freeing result 0, we're using (in bytes): 64828 After query #1, we're using (in bytes): 65004 After freeing result 1, we're using (in bytes): 65080 After query #2, we're using (in bytes): 65160 After freeing result 2, we're using (in bytes): 65204 After query #3, we're using (in bytes): 65284 After freeing result 3, we're using (in bytes): 65328 After query #4, we're using (in bytes): 65408 After freeing result 4, we're using (in bytes): 65452 After query #5, we're using (in bytes): 65532 After freeing result 5, we're using (in bytes): 65576 After query #6, we're using (in bytes): 65656 After freeing result 6, we're using (in bytes): 65700 After query #7, we're using (in bytes): 65780 After freeing result 7, we're using (in bytes): 65824 After query #8, we're using (in bytes): 65904 After freeing result 8, we're using (in bytes): 65948 After query #9, we're using (in bytes): 66028 After freeing result 9, we're using (in bytes): 66072 After closing the connection, we're using (in bytes): 65108 Peak memory usage for the script (in bytes): 88748
// Get the value of the "phone" field and stuff it in a variable called phone var phone = document.getElementById("phone").value; // Set some values on a form using an array called response document.getElementById("order").value = response[0]; document.getElementById("address").value = response[1];
最后还有 DOM,即文档对象模型。可能对有些读者来说 DOM 有点儿令人生畏,HTML 设计者很少使用它,即使 JavaScript 程序员也不大用到它,除非要完成某项高端编程任务。大量使用 DOM 的是 复杂的 Java 和 C/C++ 程序,这可能就是 DOM 被认为难以学习的原因。
幸运的是,在 JavaScript 技术中使用 DOM 很容易,也非常直观。现在,按照常规也许应该说明如何使用 DOM,或者至少要给出一些示例代码,但这样做也可能误导您。即使不理会 DOM,仍然能深入地探讨 Ajax,这也是我准备采用的方法。以后的文章将再次讨论 DOM,现在只要知道可能需要 DOM 就可以了。当需要在 JavaScript 代码和服务器之间传递 XML 和改变 HTML 表单的时候,我们再深入研究 DOM。没有它也能做一些有趣的工作,因此现在就把 DOM 放到一边吧。
function callServer() { // Get the city and state from the web form var city = document.getElementById("city").value; var state = document.getElementById("state").value; // Only go on if there are values for both fields if ((city == null) || (city == "")) return; if ((state == null) || (state == "")) return; // Build the URL to connect to var url = "/scripts/getZipCode.php?city=" + escape(city) + "&state=" + escape(state); // Open a connection to the server xmlHttp.open("GET", url, true); // Setup a function for the server to run when it's done xmlHttp.onreadystatechange = updatePage; // Send the request xmlHttp.send(null); }
function updatePage() { if (xmlHttp.readyState == 4) { var response = xmlHttp.responseText; document.getElementById("zipCode").value = response; } }
这些代码同样既不难也不复杂。它等待服务器调用,如果是就绪状态,则使用服务器返回的值(这里是用户输入的城市和州的 ZIP 编码)设置另一个表单字段的值。于是包含 ZIP 编码的 zipCode 字段突然出现了,而用户没有按任何按钮!这就是前面所说的桌面应用程序的感觉。快速响应、动态感受等等,这些都只因为有了小小的一段 Ajax 代码。
细心的读者可能注意到 zipCode 是一个普通的文本字段。一旦服务器返回 ZIP 编码,updatePage() 方法就用城市/州的 ZIP 编码设置那个字段的值,用户就可以改写该值。这样做有两个原因:保持例子简单,说明有时候可能希望 用户能够修改服务器返回的数据。要记住这两点,它们对于好的用户界面设计来说很重要。
Brett McLaughlin 从 Logo 时代就开始使用计算机。(还记得那个小三角吗?)近年来,他已经成为 Java 和 XML 社区最著名的作者和程序员之一。他曾经在 Nextel Communications 实现过复杂的企业系统,在 Lutris Technologies 编写过应用服务器,最近在 O’Reilly Media, Inc. 继续撰写和编辑这方面的图书。Brett 即将出版的新书 Head Rush Ajax,和畅销书作者 Eric 与 Beth Freeman 一起为 Ajax 带来了获奖的革命性 Head First 方法。最近的著作 Java 1.5 Tiger: A Developer’s Notebook 是关于 Java 技术最新版本的第一本书,经典的 Java and XML 仍然是在 Java 语言中使用 XML 技术的权威著作。
–创建对象(表、视图、存储过程、函数)命令]
CREATE TABLE/VIEW/PROCEDURE/FUNCTION
–创建表
CREATE TABLE tabTestVB
(VbName varchar(10),value numeric(10))
GO
CREATE TABLE tabTestVB1
(VbName varchar(10),value1 numeric(10))
GO
–插入数据(两种方式)
INSERT INTO tabTestVB(VbName,value)
SELECT ‘AAA’,123
INSERT INTO tabTestVB1(VbName,value1)
SELECT ‘AAA’,456
INSERT INTO tabTestVB(VbName,value) VALUES (‘BBB’,345)
INSERT INTO tabTestVB1(VbName,value1) VALUES (‘CCC’,1002)
–更改数据
UPDATE tabTestVB SET value=798 WHERE VbName=’AAA’
–关联更改
UPDATE tabTestVB SET value=tabTestVB1.value1
FROM tabTestVB1 WHERE tabTestVB.VbName=tabTestVB1.VbName
–删除数据
DELETE tabTestVB WHERE VbName=’AAA’
–无日志删除数据
TRUNCATE TABLE tabTestVB
–删除对象(表、视图、存储过程、函数)命令
DROP TABLE/VIEW/PROC/FUNCTION
–删除表
DROP TABLE tabTestVB
DROP TABLE tabTestVB1
–赋值命令
SET
–定义变量
DECLARE
–流程控制语句
WHILE … BREAK
BEGIN … END
IF …ELSE
—-1…100 的和
DECLARE @NN NUMERIC(3)
DECLARE @SUM NUMERIC(8)
SET @NN=1
SET @SUM=0
WHILE @NN<=100
BEGIN
SET @SUM=@SUM+@NN
SET @NN=@NN+1
END
SELECT @SUM
–加上条件:当@NN=20 时退出循环(计算出1…19的和)
DECLARE @NN NUMERIC(3)
DECLARE @SUM NUMERIC(8)
SET @NN=1
SET @SUM=0
WHILE @NN<=100
BEGIN
IF @NN<>20
–BEGIN
SET @SUM=@SUM+@NN
–END
ELSE
–BEGIN
BREAK
–END
SET @NN=@NN+1
END
SELECT @SUM
–全局变量
@@ROWCOUNT
–返回受上一语句影响的行数
SELECT ‘1’
UNION ALL
SELECT ‘3’
SELECT @@ROWCOUNT
@@ERROR
–返回最后执行的 Transact-SQL 语句的错误代码。
SET @N =1
SELECT @@ERROR