PHP ile MySQL iki alanını seçme

4 Cevap php

Ben PHP ve MySQL için nispeten yeni ve php ile mysql iki değeri seçmek için bilmek istiyorum.

Ne i var olan

$query = sprintf("SELECT COUNT(id) FROM table WHERE UPPER(username) = UPPER('%s') AND password='%s'"...

Bu durumda, sadece seçme ve id varsa saymak ve i kullanma ediyorum

list($count) = mysql_fetch_row($result);
        if($count == 1)

ve çerezleri kullanarak, ben veritabanından iki değer yani kullanıcı (kullanıcı adı) ve güç (ki onlar görmek mümkün olacaktır menüsünü gösteren, 1,2 veya 3 değerine sahiptir) temelde için almak istiyorum Eğer yönetici ya da normal bir kullanıcı iseniz ayırt, ama yapabileceğini acaba

SELECT COUNT(id) AND power FROM table WHERE ...

Bu mümkün mü? ya da başka bir yolu var mı?

Lütfen bana yol, teşekkürler.

4 Cevap

Böyle bir şey yapmak zorunda olacak:

SELECT username, power FROM table WHERE UPPER(username) = UPPER('%s') AND password='%s'"...

Size bir sonuç verir eğer öyleyse, bu kullanıcı adı ve şifre eşleşme anlamına gelir, ve bu satırın adı ve güce sahip olacak.

Bye!

Sadece yapabilirdi

SELECT power FROM table WHERE ... LIMIT 1

ve daha sonra:

$numRows = mysql_num_rows($result);
if($numRows == 1){
    $pow = mysql_fetch_row($result)[0];
}

(Test, ama bence :) çalışması gerekir değil)

EDIT:

Eğer bir alanda daha fazla seçmek istiyorsanız:

SELECT power, somethingelse, yetanotherfield FROM table ...

$row = mysql_fetch_row($result);
$pow = $row[0];
$stelse = $row[1];
...

Neden 'id alanlarının sayısını saymak gerekiyor?

Sadece bir veritabanından sadece iki alanları çekmek istiyorsanız, 'WHERE tabloda SELECT id, güç ...' kullanmalısınız

AND is a logical operator that returns true iff tüm argümanları doğrudur. Eğer bir sonucu birden fazla sütunu olan bahsediyoruz, sadece virgülle ayırın:

SELECT COUNT(id), power 
  FROM table
  WHERE ...

Ancak, power functionally dependent id üzerinde değil ve birden fazla satır ile varsa bir id, herhangi alabilir verildi power değerlerinin (MySQL dışındaki DBMSs, sen bile çalışmak sorgu için GROUP BY iktidara gerekir).

Bunun yerine PHP teklik dayatmanın, bir UNIQUE indeksi on column username. Column id bu eşsiz ima birincil anahtar olmalıdır beyan ederim.

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(64) UNIQUE NOT NULL,
    ...
);

Veya, tablo zaten varsa,

CREATE UNIQUE INDEX username ON users (username);

Off Topic

UPPER sütun username arayarak, MySQL sorguyu yürütmek için tüm tabloyu taramak zorunda neden, kullanılan herhangi bir dizin önlenmesi ediyoruz. Eğer kullanıcı adları harf duyarsız olmasını istiyorsanız, onları saklamadan önce çevirebiliriz. Bu kolayca MySQL başvuru kılavuzunda okuyabilirsiniz ki, triggers ile gerçekleştirilir.

delimiter ;;
CREATE TRIGGER upcase_username_insert
  BEFORE INSERT
  ON TABLE users
FOR EACH ROW
  NEW.username=UPPER(NEW.username)
END;;
CREATE TRIGGER upcase_username_update
  BEFORE UPDATE
  ON TABLE users
FOR EACH ROW
  NEW.username=UPPER(NEW.username)
END;;
delimiter ;

Dizeleri iyi çalışacaktır birleştirmek için sprintf kullanırken, standart bir uygulama değil. Değişkenler interpolated, çift tırnaklı dizge içine, böylece sadece yazabilirsiniz "SELECT ... WHERE ".

Eğer hashed and salted passwords yerine düz şifreler daha (MD5 olmayan bir kriptografik olarak güvenli karma, bu gün kullanmakta) depolamak emin olun.

Son olarak, ama en önemlisi, sorgu yansıtılmadan değerler gelen ve ne diğer işleme onlara yapılan yere göre, sizin sorgu SQL injection karşı savunmasız olabilir. (Hazır deyim parametreler SQL enjeksiyon yenilmez olan) yerine PDO ve prepared statements kullanın. Oku "Writing MySQL Scripts with PHP and PDO" bir PDO öğretici.