Използване на Prepared Statements

swlight

Registered
Здравейте. Поради четене насам-натам из интернет, и съвети от потребители тук реших да използвам prepare statements, но имам един въпрос, колкото и елементарен да е за някои от вас.

Ако искам да правя примерно регистрация, и искам да проверявам променливите примерно дали името е по-късо от 5 символа, дали email-а е валиден, къде трябва да правя това? след като биндвам променливите, или след това? Много бих се радвал ако някой даде някакъв пример. Търсих в интернет, но примерите, които намирах бяха просто променливите да се биндват и да се добавят в базата данни, нямаше никакви проверки.

Благодаря предварително.
 
Ето ти примери от документацията:
MYSQLi

PHP:
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");

//първо биндваш
$stmt->bind_param('sssd', $code, $language, $official, $percent);

//след това даваш стойности
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

//накрая изпълняваш
$stmt->execute();

printf("%d Row inserted.\n", $stmt->affected_rows);

/* close statement and connection */
$stmt->close();
PDO
PHP:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
//първо биндваш
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

//даваш стойности
$name = 'one';
$value = 1;
//изпълняваш
$stmt->execute();

// insert another row with different values
//даваш стойности
$name = 'two';
$value = 2;
//изпълняваш (за втори път , но с други стойности)
$stmt->execute();
Тук трябва да се каже, че bindparam приема references, тоест ако му подадеш някаква променлива и после я промениш, това ще промени и стойността в заявката. Следователно можеш да направиш проверката и след биндването. Ако обаче използваш този подход:

(pdo)
PHP:
<?php
$a = 5;
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($a))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}
?>
Първо трябва да провериш $a и след това да execute-неш.
Важна е последователността:

Когато имаш insert или delete
1. bind
2. задаваш стойности
3. изпълняваш

Когато имаш select:
1. задаваш стойности
2. bind и execute в една команда
 
Това го знам, аз друго питах, къде точно да пиша проверките, които искам да правя за самите променливи. Като цяло използвам процедурно.

//след това даваш стойности

след това?
 
swlight каза:
Това го знам, аз друго питах, къде точно да пиша проверките, които искам да правя за самите променливи. Като цяло използвам процедурно.

//след това даваш стойности

след това?
Давам ти пример със система за логин.

Първо провеяваш дали всички данни са коретно попълнени (тоест проверките са първи)
След това потготвяш заявката.
После задаваш променливите.
Накрая изпълняваш и взимаш резултатите.

PHP:
// 1. проверки
if (!isset($_GET['user']) || !isset($_GET['pass'] || strlen($_GET['user']) < 5 || strlen($_GET['pass']) < 5) {
die('error');
}

// 2. подготвяш
$stmt = mysqli_prepare('select * from users where username=? and password=?');

//3. задаваш кои ще са променливите
mysqli_stmt_bind_param($stmt, 'ss',$_GET['user'], $_GET['pass']);

//4. изпълняваш
mysqli_stmt_execute($stmt);

//5. някви други неща
if(mysqli_stmt_num_rows($stmt)) {
echo "logged";
} else {
echo "not logged";
}
Надявам се от това да разбереш какво да правиш и да си го нагодиш към твоята ситуация. Ако не - опиши по-конкретно какво искаш да направиш, за да получиш по-ясен отговор. ?:?
 
Благодаря! Гледам, че самите проверки ги правиш най-отгоре, могат ли да се правят след bind_param или трябва задължително преди това?
 
swlight каза:
Благодаря! Гледам, че самите проверки ги правиш най-отгоре, могат ли да се правят след bind_param или трябва задължително преди това?
Това което е задължително, е да ги направиш преди execute.

Така пак ще тръгне:
PHP:
$stmt = mysqli_prepare('select * from users where username=? and password=?');

mysqli_stmt_bind_param($stmt, 'ss',$_GET['user'], $_GET['pass']);

//проверки
if (!isset($_GET['user']) || !isset($_GET['pass'] || strlen($_GET['user']) < 5 || strlen($_GET['pass']) < 5) {
die('error');
}

mysqli_stmt_execute($stmt);

if(mysqli_stmt_num_rows($stmt)) {
echo "logged";
} else {
echo "not logged";
}
(проверките тук са след биндването)
Но това логически безсмислено - потготвяш заявка и след това излизаш от програмата.
Вярно, ще работи по същия начин, но защо да го правиш?
Последователността при всякакви такива неща винаги е първо да провериш входните данни и след това да ги подадеш към БД-то.
 

Back
Горе