PHP头条
热点:

如提高运行效率,减小资源占用?

如果你的SQL查询可能会返回大量的记录,那么就用无缓冲查询代替缓冲查询能提高效率。无缓冲查询消耗较少的内存,它还可以让你在查询完成执行前开始处理结果集。不过这也有缺点,无缓冲查询无法使用drizzle_result_row_count()这样的函数,因为PHP的缓存里没有一个完整的结果集,自然也就无法计算它有多少条记录了。

下面的示例使用的是Drizzle 扩展的无缓冲查询:

  1. < html> 
  2.   < head> 
  3.     < style type="text/css"> 
  4.     table,tr,td {  
  5.       border: solid 1px black;    
  6.       border-collapse: collapse;  
  7.       padding: 5px;  
  8.     }  
  9.     < /style> 
  10.   < /head> 
  11.   < body> 
  12.   < h2>List Items< /h2> 
  13.   < ?php  
  14.   // set connection parameters  
  15.   $host = 'localhost';  
  16.   $port = 4427;  
  17.   $user = 'root';  
  18.   $pass = 'guessme';  
  19.   $db = 'test';  
  20.     
  21.   // create drizzle object  
  22.   $drizzle = drizzle_create();  
  23.     
  24.   // connect to database server  
  25.   $conn = drizzle_con_add_tcp($drizzle, $host, $port, $user, $pass, $db, 0)  
  26.     or die('ERROR: ' . drizzle_error($drizzle));  
  27.     
  28.   // execute query  
  29.   $sql = 'SELECT ItemDesc, ItemQty FROM items';  
  30.   $result = @drizzle_query($conn, $sql)  
  31.     or die('ERROR: ' . drizzle_con_error($conn));  
  32.     
  33.   // skip field names  
  34.   drizzle_column_skip($result);  
  35.  
  36.   // iterate over records and fields  
  37.   echo '< table>';      
  38.   while (($row = drizzle_row_read($result))) {  
  39.     echo '< tr>';  
  40.     while ($fields = drizzle_field_read($result)) {  
  41.       // if this is the end of the record  
  42.       // go to next record        
  43.       if (drizzle_result_return_code($result) == DRIZZLE_RETURN_ROW_END) {  
  44.         break;  
  45.       }   
  46.       echo '< td>' . $fields[0] . '< /td>';        
  47.     }  
  48.     echo '< /tr>';  
  49.   }  
  50.   echo '< /table>';  
  51.     
  52.   // free result set  
  53.   drizzle_result_free($result);  
  54.     
  55.   // close connection  
  56.   drizzle_con_close($conn);  
  57.   ?> 
  58.   < /body> 
  59. < /html> 

前半部分的代码与之前你所看到的是相同的。但是,查询执行完后,drizzle_result_buffer()并没有被调用,而是直接使用了drizzle_row_read()和drizzle_field_read()方法来遍历无缓冲结果集并输出各个字段的值。另外还注意drizzle_column_skip()这个函数,它用来在返回的数据包里跳过列的名字。

下面是用面向对象接口实现了相同功能的脚本:

  1. < html> 
  2.   < head> 
  3.     < style type="text/css"> 
  4.     table,tr,td {  
  5.       border: solid 1px black;  
  6.       border-collapse: collapse;  
  7.       padding: 5px;  
  8.     }  
  9.     < /style> 
  10.   < /head> 
  11.   < body> 
  12.   < h2>List Items< /h2> 
  13.   < ?php  
  14.   // set connection parameters  
  15.   $host = 'localhost';  
  16.   $port = 4427;  
  17.   $user = 'root';  
  18.   $pass = 'guessme';  
  19.   $db = 'test';  
  20.  
  21.   // create drizzle object  
  22.   $drizzle = new drizzle();  
  23.  
  24.   // connect to database server  
  25.   $conn = $drizzle->addTcp($host, $port, $user, $pass, $db, 0)  
  26.     or die('ERROR: ' . $drizzle->error());  
  27.  
  28.   // execute query  
  29.   $sql = 'SELECT ItemDesc, ItemQty FROM items';  
  30.   $result = @$conn->query($sql)  
  31.     or die('ERROR: ' . $conn->error());  
  32.  
  33.   // skip field names  
  34.   $result->columnSkip();  
  35.  
  36.   // iterate over records and fields  
  37.   echo '< table>';  
  38.   while (($row = $result->rowRead())) {  
  39.     echo '< tr>';  
  40.     while ($fields = $result->fieldRead()) {  
  41.       // if this is the end of the record  
  42.       // go to next record  
  43.       if ($result->returnCode() == DRIZZLE_RETURN_ROW_END) {  
  44.         break;  
  45.       }         
  46.       echo '< td>' . $fields[0] . '< /td>';  
  47.     }  
  48.     echo '< /tr>';  
  49.   }  
  50.   echo '< /table>';  
  51.  
  52.   // close connection  
  53.   $conn->close();  
  54.  
  55.   // deinitialize object  
  56.   unset($drizzle);  
  57.   ?> 
  58.   < /body> 
  59. < /html> 

添加和删除

你也可以使用drizzle_query()函数,或者是query()方法来执行INSERT, UPDATE 和 DELETE查询。下面这个例子演示了执行一个INSERT查询并通过insertId()方法获取新插入的这条记录的ID号。

  1. < html> 
  2.   < head> 
  3.     < style type="text/css"> 
  4.     table,tr,td {  
  5.       border: solid 1px black;  
  6.       border-collapse: collapse;  
  7.       padding: 5px;  
  8.     }  
  9.     < /style> 
  10.   < /head> 
  11.   < body> 
  12.   < h2>List Items< /h2> 
  13.   < ?php  
  14.   // set connection parameters  
  15.   $host = 'localhost';  
  16.   $port = 4427;  
  17.   $user = 'root';  
  18.   $pass = 'guessme';  
  19.   $db = 'test';  
  20.  
  21.   // create drizzle object  
  22.   $drizzle = new drizzle();  
  23.  
  24.   // connect to database server  
  25.   $conn = $drizzle->addTcp($host, $port, $user, $pass, $db, 0)  
  26.     or die('ERROR: ' . $drizzle->error());  
  27.  
  28.   // execute query  
  29.   $sql = "INSERT INTO items (ItemDesc, ItemQty) VALUES ('Jam', '2')";  
  30.   $result = @$conn->query($sql)  
  31.     or die('ERROR: ' . $conn->error());  
  32.  
  33.   // get record ID  
  34.   echo 'Record inserted with ID: ' . $result->insertId();  
  35.     
  36.   // close connection  
  37.   $conn->close();  
  38.  
  39.   // deinitialize object  
  40.   unset($drizzle);  
  41.   ?> 
  42.   < /body> 
  43. < /html> 

输出如下:

添加和删除 

下面是另外一个例子,它执行一个DELETE语句,并用affectedRows()方法函数返回受影响的行数。

  1. < html> 
  2.   < head> 
  3.     < style type="text/css"> 
  4.     table,tr,td {  
  5.       border: solid 1px black;  
  6.       border-collapse: collapse;  
  7.       padding: 5px;  
  8.     }  
  9.     < /style> 
  10.   < /head> 
  11.   < body> 
  12.   < h2>List Items< /h2> 
  13.   < ?php  
  14.   // set connection parameters  
  15.   $host = 'localhost';  
  16.   $port = 4427;  
  17.   $user = 'root';  
  18.   $pass = 'guessme';  
  19.   $db = 'test';  
  20.  
  21.   // create drizzle object  
  22.   $drizzle = new drizzle();  
  23.  
  24.   // connect to database server  
  25.   $conn = $drizzle->addTcp($host, $port, $user, $pass, $db, 0)  
  26.     or die('ERROR: ' . $drizzle->error());  
  27.  
  28.   // execute query  
  29.   $sql = "DELETE FROM items WHERE ItemID > 4";  
  30.   $result = @$conn->query($sql)  
  31.     or die('ERROR: ' . $conn->error());  
  32.  
  33.   // get number of records affected  
  34.   echo $result->affectedRows() . ' record(s) deleted';  
  35.     
  36.   // close connection  
  37.   $conn->close();  
  38.  
  39.   // deinitialize object  
  40.   unset($drizzle);  
  41.   ?> 
  42.   < /body> 
  43. < /html> 

Drizzle PHP扩展还提供了drizzle_escape_string()函数和excape()方法,它可以在把用户的输入插入到查询语句前先对其进行转义。处理用户提交的数据是非常重要的安全措施,这样才能减小受到SQL注入攻击的危险。在下面这一个例子里,我们提供了一个不安全的Web表单,用户可以通过这个表单直接向数据库里添加新的条目,从而示范了excape()函数的使用。

  1. < html> 
  2.   < head> 
  3.     < style type="text/css"> 
  4.     table,tr,td {  
  5.       border: solid 1px black;  
  6.       border-collapse: collapse;  
  7.       padding: 5px;  
  8.     }  
  9.     < /style> 
  10.   < /head> 
  11.   < body> 
  12.     < h2>List Items< /h2>      
  13.     < ?php  
  14.     // set connection parameters  
  15.     $host = 'localhost';  
  16.     $port = 4427;  
  17.     $user = 'root';  
  18.     $pass = 'guessme';  
  19.     $db = 'test';  
  20.     
  21.     // create drizzle object  
  22.     $drizzle = new drizzle();  
  23.     
  24.     // connect to database server  
  25.     $conn = $drizzle->addTcp($host, $port, $user, $pass, $db, 0)  
  26.       or die('ERROR: ' . $drizzle->error());  
  27.       
  28.     // check if form submitted  
  29.     // sanitize input and add record  
  30.     if ($_POST['submit']) {  
  31.       // escape input strings  
  32.       $desc = $drizzle->escape($_POST['desc']);  
  33.       $qty = $drizzle->escape($_POST['qty']);  
  34.       
  35.       // execute query  
  36.       $sql = "INSERT INTO items (ItemDesc, ItemQty) VALUES ('$desc', '$qty')";  
  37.       $result = @$conn->query($sql)  
  38.         or die('ERROR: ' . $conn->error());  
  39.           
  40.       // get record ID  
  41.       echo 'Record inserted with ID: ' . $result->insertId();  
  42.     }  
  43.     
  44.     // execute query  
  45.     $sql = 'SELECT ItemID, ItemDesc, ItemQty FROM items';  
  46.     $result = @$conn->query($sql)  
  47.       or die('ERROR: ' . $conn->error());  
  48.     
  49.     // buffer result set  
  50.     $result->buffer()  
  51.      or die('ERROR: ' . $conn->error());  
  52.     
  53.     // check number of rows in result set and print  
  54.     if ($result->rowCount()) {  
  55.       echo '< table>';  
  56.       echo '< tr>';  
  57.       echo '< td>ID< /td>';  
  58.       echo '< td>Name< /td>';  
  59.       echo '< td>Quantity< /td>';  
  60.       echo '< /tr>';  
  61.       while (($row = $result->rowNext())) {  
  62.         echo '< tr>';  
  63.         echo '< td>' . $row[0] . '< /td>';  
  64.         echo '< td>' . $row[1] . '< /td>';  
  65.         echo '< td>' . $row[2] . '< /td>';  
  66.         echo '< /tr>';  
  67.       }  
  68.       echo '< /table>';  
  69.     } else {  
  70.       echo 'No records found';  
  71.     }  
  72.     
  73.     // close connection  
  74.     $conn->close();  
  75.     
  76.     // deinitialize object  
  77.     unset($drizzle);  
  78.     ?> 
  79.  
  80.     < h2>Add Item< /h2>      
  81.     < form method="post" action="< ?php echo htmlentities($_SERVER['PHP_SELF']); ?>"> 
  82.     Item name:   
  83.     < br /> 
  84.     < input type="text" name="desc"> 
  85.     < br /> 
  86.     Item quantity:   
  87.     < br />      
  88.     < input type="text" name="qty"> 
  89.     < br /> 
  90.     < input type="submit" name="submit" value="Save"> 
  91.     < /form> 
  92.  
  93.   < /body> 
  94. < /html> 

表格起初是这样的:

表格起初是这样的 

提交一条记录后变成这样:

提交一条记录后变成这样 

注意这段代码在将用户输入值插入到SQL查询语句中之前都先调用了escape()方法;它会对用户输入数据中的特殊字符进行处理。


www.phpzy.comtrue/php/17609.htmlTechArticle如提高运行效率,减小资源占用? 如果你的SQL查询可能会返回大量的记录,那么就用无缓冲查询代替缓冲查询能提高效率。无缓冲查询消耗较少的内存,...

相关文章

PHP之友评论

今天推荐