mysql_real_escape_string 報錯_addslashes與mysql_real_escape_string的區別

addslashes和mysql_real_escape_string.都是為了使數據安全的插入到數據庫中而進行過濾.那么這兩個函數到底是有什么區別呢??

我們今天來簡單的看下..

首先.我們還是從PHP手冊入手..

手冊上addslashes轉義的字符是單引號(')、雙引號(")、反斜線(\)與NUL(NULL 字符)。

mysql_real_escape_string轉義的字符并沒有被提到.只是說了一句

注意: mysql_real_escape_string() 并不轉義% 和_。

為什么PHP手冊沒有說呢?因為其實這是個MySql的C的API.所以我們需要查下MySql手冊..上面是這么說的.

編碼的字符為NUL (ASCII 0)、'\n'、'\r'、'\'、'''、'"'、以及Control-Z(請參見9.1節,“文字值”)。(嚴格地講,MySQL僅需要反斜杠和引號字符,用于引用轉義查詢中的字符串。該函數能引用其他字符,從而使得它們在日志文件中具有更好的可讀性)。

不得不說一句.MySql手冊上面的話總是令人費解的..

我們為了更深層次的探究這兩個函數的不同..還是去看一看PHP的源碼吧..

這是PHP的addslashes函數..

PHP_FUNCTION(addslashes)

{

zval **str;

if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {

WRONG_PARAM_COUNT;

}

convert_to_string_ex(str);

if (Z_STRLEN_PP(str) == 0) {

RETURN_EMPTY_STRING();

}

RETURN_STRING(php_addslashes(Z_STRVAL_PP(str),

Z_STRLEN_PP(str),

&Z_STRLEN_P(return_value), 0

TSRMLS_CC), 0);

}

很顯然.它調用了php_addslashes.我們繼續看這個函數

PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_free TSRMLS_DC)

{

return php_addslashes_ex(str, length, new_length, should_free, 0 TSRMLS_CC);

}

結果又是是在調用php_addslashes_ex 我們就像在剝洋蔥一樣..一步一步的接近真理..

PHPAPI char *php_addslashes_ex(char *str, int length, int *new_length, int should_free, int ignore_sybase TSRMLS_DC)

{

/* maximum string length, worst case situation */

char *new_str;

char *source, *target;

char *end;

int local_new_length;

if (!new_length) {

new_length = &local_new_length;

}

if (!str) {

*new_length = 0;

return str;

}

new_str = (char *) safe_emalloc(2, (length ? length : (length = strlen(str))), 1);

source = str;

end = source + length;

target = new_str;

if (!ignore_sybase && PG(magic_quotes_sybase)) {

while (source < end) {

switch (*source) {

case '\0':

*target++ = '\\';

*target++ = '0';

break;

case '\'':

*target++ = '\'';

*target++ = '\'';

break;

default:

*target++ = *source;

break;

}

source++;

}

} else {

while (source < end) {

switch (*source) {

case '\0':

*target++ = '\\';

*target++ = '0';

break;

case '\'':

case '\"':

case '\\':

*target++ = '\\';

/* break is missing *intentionally* */

default:

*target++ = *source;

break;

}

source++;

}

}

*target = 0;

*new_length = target - new_str;

if (should_free) {

STR_FREE(str);

}

new_str = (char *) erealloc(new_str, *new_length + 1);

return new_str;

}

上面的函數已經非常清楚的描述出都要轉義哪些字符了..現在我們去看一看mysql_real_escape_string

這個不在string.c里了..是在mysql擴展中.

PHP_FUNCTION(mysql_real_escape_string)

{

zval *mysql_link = NULL;

char *str;

char *new_str;

int id = -1, str_len, new_str_len;

php_mysql_conn *mysql;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &str, &str_len, &mysql_link) == FAILURE) {

return;

}

if (ZEND_NUM_ARGS() == 1) {

id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);

CHECK_LINK(id);

}

ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);

new_str = safe_emalloc(str_len, 2, 1);

new_str_len = mysql_real_escape_string(&mysql->conn, new_str, str, str_len);

new_str = erealloc(new_str, new_str_len + 1);

RETURN_STRINGL(new_str, new_str_len, 0);

}

這個函數并沒有像上面的那樣剝洋蔥..

而是直接調用了MySql的C的API.mysql_real_escape_string()..

需要注意的是.這個函數在調用mysql_real_escape_string這個API之前.先是判斷了是否連接上了數據庫

CHECK_LINK(id);?? //就是這句

所以這就意味著mysql_real_escape_string必須是連接數據庫之后才能使用.為了證實這一點.

我們來簡單的實驗下.

echo mysql_real_escape_string("fdsafda'fdsa");

結果

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in PHPDocument1 on line 2

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in PHPDocument1 on line 2

果然報錯了..顯示沒有鏈接上數據庫..

好了..總結就先告一段落..

我們終于明白為什么那么多開源的程序比如Discuz用addslashes而不用mysql_real_escape_string了.

所以呢.以后也就用addslashes好了..暫時可以忘記掉mysql_real_escape_string了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443611.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell執行perl_【編程技巧(一)】在Perl、Shell和Python中傳參與輸出幫助文檔

社會你明哥&#xff0c;人狠話又多&#xff01;【小明的碎碎念】與你不見不散&#xff01;作為一名搞數據的生物狗&#xff0c;咱們是生物狗中代碼寫得最六的&#xff0c;程序員中生物學得最好的——大家沒意見吧&#xff0c;有意見請憋著跟隨小明的步伐&#xff0c;讓我們開開…

項目開發中的編碼規范

1.規范存在的意義&#xff1a; 好的編碼規范可以盡可能的減少一個軟件的維護成本 , 并且幾乎沒有任何一個軟件&#xff0c;在其整個生命周期中&#xff0c;均由最初的開發人員來維護&#xff1b; 好的編碼規范可以改善軟件的可讀性&#xff0c;可以讓開發人員盡快而徹底地理解…

mysql 5.6.36安裝圖解_2017年12月聚合文章--實戰-Mysql5.6.36腳本編譯安裝及初始化 | 碼友網...

概述本文為centos7.3自動化編譯安裝mysql5.3.6的腳本及后續初始化操作&#xff0c;話不多少&#xff0c;直接上腳本。安裝腳本install.py如下&#xff1a;#codingutf-8#!/usr/bin/pythonimport os,commands#定義變量install_dir /data/mysqldata_dir /data/mysql/datapackage…

python之路2.0_Python之路【第二十一篇】:JS基礎

1.2 ECMAScript盡管 ECMAScript 是一個重要的標準&#xff0c;但它并不是 JavaScript 唯一的部分&#xff0c;當然&#xff0c;也不是唯一被標準化的部分。實際上&#xff0c;一個完整的 JavaScript 實現是由以下 3 個不同部分組成的&#xff1a;● 核心(ECMAScript)● 文檔對象…

solr4 mysql自動更新_(solr系列:五) solr定時實時重建索引和增量更新

將mysql中的數據導入到了solr中之后&#xff0c;如果數據庫中的數據有變動&#xff0c;solr中還是第一次導入的舊的數據&#xff0c;那該如何是好呢&#xff1f;該如何實現mysql數據庫中的數據定時同步到solr中呢&#xff1f;下面將做詳細的介紹。準備工作要做好&#xff1a;1、…

mysql pydev_pydev-python 鏈接mysql數據庫(mac系統)

在mac os上安裝MySQLdb&#xff0c;遇到了非常多問題&#xff0c;總結一下&#xff1a;首先。假設用sudo easy_install mysql-python命令安裝&#xff0c;基本上不會成功的&#xff0c;原因有兩個&#xff1a;一是找不到mysql_config位置&#xff0c;二是如今基本上安裝的是64位…

MySQL多個線程同時寫數據_多個線程可以同時將數據寫入文件嗎?

同步聲明可以做到這一點。嘗試下面的代碼&#xff0c;我在類似的情況下使用。package hrblib;import java.io.*;public class FileOp {static int nStatsCount 0;static public String getContents(String sFileName) {try {BufferedReader oReader new BufferedReader(new F…

Java在Linux下創建文件,文件夾,刪除,拷貝文件的命令

1.創建&#xff0c;刪除文件夾,復制文件夾 mkdir,rmdir如:mkdir -p dir1/dir2 //-p表示遞歸創建文件夾 cp -r /tmp/a /root/a //拷貝不強制覆蓋cp -rf /tmp/a /root/a //拷貝強制覆蓋 2.創建&#xff0c;刪除文件 vi&#xff0c;touch都可以創建文件。如:vi fileNametouch f…

python 拼多多_拼多多現重大BUG被“薅羊毛”,教你如何用Python簡單褥羊毛

import timefrom urllib.parse import parse_qsimport requestsfrom bs4 import BeautifulSoupfrom selenium import webdriverfrom selenium.common.exceptions import *from selenium.webdriver.support.wait import WebDriverWait# 額外抽取的授權模塊from utils import aut…

上海交通大學python期末考試樣題加解析_上海交通大學python期末考試樣題加解析...

一、選擇題: 將唯一正確的選項寫在題前括號中.每題2分.【】(1) 本課程的目標定位是什么?[A] 學習Python語言[B] 學習計算機的工作原理[C] 學習各種算法[D] 學習用計算機解決問題【】(2) 下列哪個標識符是合法的?[A] var-name [B] !#$% [C] _100 [D] elif【】(3) 執行下列語句…

mysql 安裝測試ok_tpcc-mysql安裝測試與使用的實例教程

1&#xff1a;下載tpcc-mysql的壓縮包&#xff0c;從下面的網站進行下載也可直接從葉總博客直接下載&#xff1a;我這邊使用的就是后者。2&#xff1a;安裝tpcc-mysql[rootmxqmongodb2 tpccmysql]# gunzip tpcc-mysql-src.tgz[rootmxqmongodb2 tpccmysql]# tar xf tpcc-mysql-s…

python多線程寫同一文件_Python多線程寫文件實例

# -*- coding: utf-8 -*-import threading多線程生成日志工具__author ["yangfei" ]#該方法主要用于寫入300行WARN日志def writeWarnLog(file):count0;while count<300:try:file.write(2012-11-28 22:51:01|zookeeper|WARN|m1|172.17.1.15\n)count1except Except…

Tomcat6.0.37,tomcat6.0.37,下訪問Web項目,jsp項目不需要輸入項目名稱和端口號的配置方法...

1.不需要數據項目名稱就可以訪問項目的配置方法如下&#xff1a; 首先到你的Tomcat下的conf文件夾下找到server.xml文件&#xff0c;打開后修改為&#xff1a; <Host name"localhost" appBase"webapps"unpackWARs"true" autoDeploy"tru…

java合并list_java合并list方法代碼實例

這篇文章主要介紹了java合并list方法代碼實例,文中通過示例代碼介紹的非常詳細&#xff0c;對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下List包括List接口以及List接口的所有實現類。因為List接口實現了Collection接口&#xff0c;所以List接口擁有Collec…

java math 函數_Java中Math類常用函數總結

Java中比較常用的幾個數學公式的總結&#xff1a;//取整&#xff0c;返回小于目標函數的最大整數,如下將會返回-2Math.floor(-1.8)&#xff1b;//取整&#xff0c;返回發育目標數的最小整數Math.ceil()//四舍五入取整Math.round()//計算平方根Math.sqrt()//計算立方根Math.cbrt…

java asc碼_Java中ASC碼與字符互相轉化

package com.ljq.test;/*** Java中ASC碼與字符互相轉化** author jiqinlin**/public class ASCTest {private static int ascNum;private static char strChar;public static void main(String[] args) {System.out.println(getAsc("a"));System.out.println(backcha…

java上傳png_java上傳png圖片出現紅色背景

java圖片上傳出現紅色背景java圖片服務器上傳圖片都很正常&#xff0c;唯獨上傳png圖片時&#xff0c;png圖片變成紅色背景原因是讀取上傳數據時用的是ImageIO.read(inputstream)方法public static BufferedImage getImages(byte[] data) throws IOException {ByteArrayInputSt…

java 引用隊列_Java中管理資源的引用隊列相關原理解析

當對象改變其可達性狀態時&#xff0c;對該對象的引用就可能會被置于引用隊列(reference queue)中。這些隊列被垃圾回收器用來與我們的代碼溝通有關對象可達性變化的情況。這些隊列是探測可達性變化的最佳方式&#xff0c;盡管我們也可以通過檢查get方法的返回值是不是null來探…

Tomcat 替換項目圖標

1.首先制作一個32*32像素的圖標&#xff0c;命名為favicon.ico這里名稱必須是和Tomcat的webapps下的ROOT下的一樣。 2.把制作好的圖標放到你要部署的Web項目的images目錄下&#xff0c;如果你的Web項目有過濾器等&#xff0c;要給后綴名為.ico的圖標放行。 3.最后你就可以在你需…

hp 導出日志 遠程管理卡_惠普服務器遠程管理卡安裝詳解

可以遠程管理服務器。帶惠普基于Web的網絡資源管理和性能監視工具HP Toptools惠普遠程管理卡的主要功能是可以實現對服務器的遠程監控&#xff0c;其中包括察看日志、遠程診斷、遠程開/關機、重啟等等。基于惠普遠程管理卡的重要功能&#xff0c;本文將著重介紹惠普遠程管理卡的…