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

スケーラブルでない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 . — .


Source: https://habr.com/ru/post/J148446/


All Articles