[PHP][PDO] Проблем

  • Автор Автор niker
  • Начална дата Начална дата

niker

Registered
PHP:
$db = конекцията!
$result = $db->query("SELECT * FROM configs");
while ($configs = $result->fetch(PDO::FETCH_ASSOC)) {
global $configs;
echo $configs['title'];
}

Идеята ми е да извикам: global $configs;
Връща резултата: $configs;['title']
Обаче не ми задава глобал.
Идеи ?
 
Може и да се бъркам нещо, ама да си изкажа мнението :D
Принципът на глобализирането на променлива е друг, но да оставим това настрана.
Наясно си, че това, което въртиш в цикъла реално се върти и се повтаря N-брой пъти, докато условията при, които цикълът върви не се нарушат.
Да кажем, че твоят цикъл се върти 10 пъти.
Защо 10 пъти трябва global $configs да се итерира?
Сподели идеята си, че нещо ми убягва. :)
 
Нещо не мога да разбера. Вадиш резултат посредством променлива $configs и следователно се мъчиш да я извикаш глобално ?
Не мога да ти хвана идеята какво точно се опитваш да направиш.
 
Просто не я върти в цикъла.
PHP:
$db = конекцията!

$result = $db->query("SELECT * FROM configs");
$configs = $result->fetch(PDO::FETCH_ASSOC)

function displayTitle(){
global $configs;

print($configs["title"]);

}
 
PHP:
$valueOfmail = $db->prepare("SELECT email FROM users WHERE email='".$db->quote($_POST['email'])."'");
$valueOfmail->execute();
$valueOfmail->fetchAll();
$email_check = count($valueOfmails);
if($email_check > 0) {
echo "Вече има регистриран потребител с този Е-мейл адрес.";
}

Няма мейл с името при проверката, но пак изкарва грешка че го има.
Случайно да знаете от какво е ?

Пробвах и така:

PHP:
$valueOfmail = $db->prepare("SELECT email FROM __check_all WHERE email='".$db->quote($_POST['email'])."'");
$valueOfmail->execute();
$email_check = $valueOfmails->rowCount();
if($email_check > 0) {
echo "Вече има регистриран потребител с този Е-мейл адрес.";
}

И пак не става
 
niker, пробвай ръчно да пуснеш заявката и виж какъв резултат ще върне.
А, пък ако резултата от заявката не го използваш за нищо можеш директно да селекнеш COUNT().
А ми е чудно защо ползваш quote().
Принципно prepare() би трябвало да си свърши работата, а в случая си мисля, че се получава email=' 'email@email.com' '.
 
Не става, защото rowCount не връща броя върнати резултати при SELECT.


А първия пример би трябвало да изглежда така:

PHP:
$valueOfmail = $db->prepare("SELECT email FROM users WHERE email='".$db->quote($_POST['email'])."'");

$valueOfmail->execute();

$email_check = count($valueOfmail->fetchAll());
if($email_check > 0) {
      echo "Вече има регистриран потребител с този Е-мейл адрес.";
}


ЕДИТ: В първия пример забелязах, че в count() използваш $valueOfmails, а не $valueOfmail.

ЕДИТ 2: Не мисля също, че ползваш правилно prepare statements. Защо не си биндваш изпращаните стойности след това, чрез bindParam() ?

PHP:
$valueOfmail = $db->prepare("SELECT email FROM users WHERE email=:email");
$valueOfmail->bindParam(':email', $_POST['email'], PDO::PARAM_STR);

$valueOfmail->execute();

$email_check = count($valueOfmail->fetchAll());
if($email_check > 0) {
      echo "Вече има регистриран потребител с този Е-мейл адрес.";
}
 
Ай докат си тука да те ползвам и за това:

PHP:
$insert = $db->prepare("INSERT INTO users (id, email, hash, pwd, type) VALUES ('".uid()."', '".$db->quote($_POST['email'])."', '".$hash."', '".$db->quote($_POST['password'])."', '".$db->quote($_POST['usertype'])."')");
$insert->execute();
Хич не връща инсърта :)

И друго:

$valueOfmail->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
Това секурнато ли е с тая функцията куоте ?


3/
Разликата м/у

bindParam();
bindValue();

?
 
Според мен изобщо не използваш идеята пълноценно.
Целта на prepared statements е да не позволиш на потребителя да излезе от кавичките на полето и да допълни SQL заявката с код по негов избор. :D
Именно затова хората от PHP създадоха prepared statements.
В твоят случай би трябвало да изглежда така.

Код:
$insert = $dbh->prepare("INSERT INTO users (id, email, hash, pwd, type) VALUES (:id, :email, :hash, :pwd, :type)");
$insert ->bindParam(':id', uid());
$insert ->bindParam(':email', $_POST["email"]);
$insert ->bindParam(':hash', $hash);
$insert ->bindParam(':pwd', $_POST["password"]);
$insert ->bindParam(':type', $_POST["usertype"]);
$insert ->execute();
 
Виж в php.net как се ползват prepare statements. Тези quotes според мен се ползват като пускаш заявката с PDO::query().

PHP:
$insert = $db->prepare("INSERT INTO users (id, email, hash, pwd, type) VALUES (?, ?, ?, ?, ?)");

$insert->execute(array(uid(), $_POST['email'], $hash, $_POST['password'], $_POST['user_type']));



Разликата е, че bindParam() е обвързана като референция и ще се вика само тогава, когато се извика PDOStatement::execute().
 
Имаш ли идея как се постига ефекта на:

@mysql_data_seek($query, $startRows);

С ПДО ?

П.с. Малко те измъчих тая тема :) :oops:

Иначе мерси точката е за тебе!
 
PHP:
$valueOfmail = $db->prepare("SELECT email FROM users");

$valueOfmail->execute();

$result = $valueOfmail->fetch(PDO::FETCH_ORI_ABS);

Нещо такова.


ЕДИТ:


PHP:
$valueOfmail = $db->prepare("SELECT email FROM users", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$valueOfmail->execute();

$result = $valueOfmail->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS);
 
PHP:
$query = $db->prepare("SELECT COUNT(email) FROM users WHERE email = :email ");
$query->bindParam(':email',  $_POST['email'], PDO::PARAM_STR);
$query->execute();

/** Ще ти изведе колко съответствия на имейла който идва от пост, има в таблицата */
var_dump($query->fetchColumn());

Има една тема, която е направена важна в раздел PHP/MYSQL, специално за OOP прочети там всичко, може някой неща да ти се обяснат как става.

Биндването на параметри е съществено важно при използването на prepare statements ...

При PDO най - сигурнят начин за броене на съответствия е със COUNT() във заявката и после fetchColumn();.
 
Идеята мие да си направя странициране

PHP:
$page = (int)$_POST['page'];
$RowPerPage = 10;
$startRows = ($page-1)*$RowPerPage + 0;
$query = mysql_query("SELECT * FROM articles WHERE category= '".$category."' ORDER BY rating DESC");
$num_of_rows = mysql_num_rows($query);
@mysqli_data_seek($query, $startRows);
$TotalPages = ceil($num_of_rows / $RowPerPage);
 
Всичко, което ме пита как става ти го показах, какво не ти се получава сега?

Между другото mysqli функцията ще работи само с mysqli ресурс.
 
Revelation каза:
Всичко, което ме пита как става ти го показах, какво не ти се получава сега?

Между другото mysqli функцията ще работи само с mysqli ресурс.

Ами като например. Къде да си сложа това колко рола да ми изкарва на страница :)))
 
Това се слага в заявката на LIMIT клаузата.

http://dev.mysql.com/doc/refman/5.0/en/select.html

и виж

[LIMIT { [offset, ] row_count | row_count OFFSET offset} ]
 

Back
Горе