Проверка данных в mysqli

cyberx

Новичок
Проверка данных в mysqli

Нашел интересный пример работы с базой mysqli.
PHP:
$mysqli = new mysqli("localhost", "user", "pass", "base"); 
if (mysqli_connect_errno()) { exit(); } 
if ($stmt = $mysqli->prepare("SELECT `name` FROM `users` WHERE `id`= ?"))
{
$stmt->bind_param("s", $code);  
 $code = "41'"; 
 $stmt->execute();  
 $stmt->bind_result($name);  
 $stmt->fetch();   
 echo $name; 
 $stmt->close(); 
}  
$mysqli->close();
Какие там параметры стоит проверять на ошибки и фильтровать? А вообще есть разница между обычными запросами
mysqli и с заданными параметрами или вообще с обычным mysql? Я просто щас нашел этот пример и
не знаю стоит ли переходить на mysqli.
 

WebAngel

Новичок
Какие там параметры стоит проверять на ошибки и фильтровать?
если речь идет о фильтрации кавычек, то в этом нет необходимости

А вообще есть разница между обычными запросами mysqli и с заданными параметрами или вообще с обычным mysql?
да есть, в mysqli prepare парсит запрос и кэширует его, и при многоразовом выполнении запроса, он уже не будет парсится, ну и используется бинарный протокол для общения с сервером
 

cyberx

Новичок
Значит в prepare уже все есть? Но такие как в примере $code все таки стоит же фильтровать с помощью mysql_real_escape_string? Там где $stmt->fetch(); попытался записать $stmt->fetch_assoc(); но почему то выдает ошибку
 

Фанат

oncle terrible
Команда форума
а с чего ты взял, что эта ошибка как-то связана с кавычками?
 

cyberx

Новичок
Нет это другой вопрос, про фильтрацию я просто уточнил, стоит или нет фильтровать. Почему то не работает $stmt->fetch_assoc();
 

cyberx

Новичок
Стоит выполнять такие проверки как $stmt->bind_param("s", $code) or die("error"); и $stmt->bind_result($name) or die("error");
или это все лишнее? Просто хочется все надежно проверить чтоб не было ошибок и было все защищено.
 

WebAngel

Новичок
стоит почитать документацию

убери $stmt->bind_result($name); и используй fetch_assoc
 

Фанат

oncle terrible
Команда форума
чтобы все было защищено, вариант только один - понимать, что ты делаешь, а не тупо копировать код, потому что пацаны так сказали. поскольку этот вариант тебе не подходит, то и не парься пока. возможно, со временем поймешь.

как соотносится die("error"); с желанием избавиться от ошибок, я не понял. строка "error" - это не ошибка? А что?
 

cyberx

Новичок
Нет если тут $stmt->bind_result($name); происходит ошибка чтоб убивался процесс die; ем. Стоит сделать такую проверку или нет?
 

cyberx

Новичок
Ну если происходит ошибка то останавливает процесс. Как в обычном mysql if (!result) {die;} или if(!mysql_num_rows($result)) {die;}
 

Фанат

oncle terrible
Команда форума
а зачем останавливать процесс?
по-твоему, пустая страница или одинокое слово error - это именно то, что хочет видеть пользователь или поисковик?
 

cyberx

Новичок
error я сказал к примеру, просто хочу узнать какие функции проверять тут и вовремя остановить процесс, у меня все в функциях и в нужный момент происходит return FALSE; так что пустого экрана никто не увидИТ а просто остановиТСЯ процесс обновления или тип того. К примеру

$result = mysql_query("SELECT `user` FROM `login` WHERE `ip`='".$ip."' LIMIT 1",db);
if (!$result)
{
return FALSE;
}

if (mysql_num_rows($result) == 0)
{
return FALSE;
}

В обычном php mysql понятно какие проверять а я спрашиваю какие проверять в mysqli, стоит или нет проверять такие

if (!$stmt->bind_param("s", $code))
{
return FALSE;
}
 

Fortop

Новичок
Может настало время ознакомиться с
PHP:
try {
} catch () {
}
и
[m]set_error_handler[/m]
[m]set_exception_handler[/m]
?
 

Фанат

oncle terrible
Команда форума
так что пустого экрана никто не увидИТ
с какой стати не увидит, если у тебя стоит Die?

что значит "вовремя остановить"? какой критерий остановки?
 

cyberx

Новичок
Хорошо а какая разница между базовым использованием mysqli и с заданными параметрами, есть в защите разница? На этом примере использовано $stmt->fetch(); а $stmt->fetch_assoc(); не работает, в чем может быть причина?
 

Mols

Новичок
Причина может быть в том, что fetch_assoc() не является методом $stmt.
И ещё. Пишите более понятно.
Сложно понять что значит " базовым использованием mysqli" "с заданными параметрами" и о какой вообще защите речь.
 

Фанат

oncle terrible
Команда форума
ну, это-то как раз понятно.

"с заданными параметрами" безопаснее, поскольку с ними не надо думать, а правила искейпинга слишком сложны для среднего пользователя пыхыпы.
 

cyberx

Новичок
Вот пример базового

$link = mysqli_connect('localhost', 'password', 'world');

if ($result = mysqli_query($link,
'SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5'))
{
while($row = mysqli_fetch_assoc($result))
{
printf("%s (%s)\n", $row['Name'], $row['Population']);
}

mysqli_free_result($result);
}

mysqli_close($link);

Ту работает fetch_assoc() и num_rows() . А вот с заданными параметрами и тут не fetch_assoc() не работает и ни num_rows()

$mysqli = new mysqli("localhost", "user", "password", "world");

if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5"))
{
$stmt->bind_param("s", $code);
$code = "C%";
$stmt->execute();
$stmt->bind_result($col1, $col2);
while ($stmt->fetch())
{
printf("%s %s\n", $col1, $col2);
}

$stmt->close();
}

$mysqli->close();
 
Сверху