変数バインディング(準備済みステートメント)について少し

スケーラブルでないOracleアプリケーションの作成方法に関する本を書く必要がある場合、その最初で唯一の章のタイトルは「バインドされた変数を使用しない」です。

Oracle Vice President、Tom Kite



最近、 AlexanderPHPの記事「初心者向けのSQLインジェクション。 パート1」。 その内容と解説によると、多くの開発者は、バインド変数が何であるか、なぜ使用する必要があるのか​​、どのような利点があるのか​​わからないように見えるかもしれません。 この記事では、これらの問題について少し説明します。



バインド変数の定義


, prepared statements, ( ; , ) — SQL- , SQL-. , :

insert into someTable(name) values(‘’);





, ? -, insert , 90% ORM; ( '') — . , , ():

$request = sql_prepare('insert into table(name) values(:1)');
/*  insert into someTable(name) values(?);*/
sql_execute($request, Array(''));

      
      





, (:1, :2,...) . , , .

insert into someTable(name) values(‘’);



, , .





:

1. — , .

2. , .

3. SQL-.

.

— :

$request = sql_prepare('insert into table(name) values(:1)');
sql_execute($request, Array(''));
sql_execute($request, Array(''));
sql_execute($request, Array(''));
sql_execute($request, Array(''));

      
      





SQL- , , — .



, SQL-. , SQL- - , , . — , , . , — «» ( , ). (, , MySQL ), «» . , SQL- — . 1 — , , — . :

sql_execute("insert into table(name) values('')");
sql_execute("insert into table(name) values('')");
sql_execute("insert into table(name) values('')");
sql_execute("insert into table(name) values('')");

      
      





( ), . , «» .



. — SQL- ( , , )? ( ), prepared statements – «» sql_execute (mysql_real_query, ),

, sql_execute, . . prepared statement – . , . , , , . ( MySQL C API, PostgreSQL C library).

: — PHP PDO , SQL- . ( StackOverflow):

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      
      







— , . . . ( — ).

, - ; , . Robert');drop table students;



, , — , , .





, :



Rhaps107

mysql_real_escape_string? - ?



— mysql_real_escape_string , . . (, «» , , - ), .



@m_z21

PDO ORM . pdo , sql-.



ORM – . PDO ( MySQLi) , SQL injection , .



@VolCh21

(, ), . . mysql_* libmysql, mysqli/pdo ?





. mysqli::prepare — MySQL. , PHP. , ( ) , . « ».





, - , (prepared statements). , , . , , - , .






1. http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php — StackOverflow.

2. https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java — Java.

3. . Oracle . — .



All Articles