Oturuma veritabanından veri almak için en etkili yolu

10 Cevap php

Ben zaten ne yapmaya devam etmek zorunda kalmadan bir oturum için bir MySQL veritabanı veri büyük miktarda almak için büyük miktarda veri (golf düşünüyorum) ve en verimli (performans düşünüyorum) almak için hızlı yolu nedir:

$sql = "SELECT * FROM users WHERE username='" . mysql_escape_string($_POST['username']) . "' AND password='" . mysql_escape_string(md5($_POST['password'])) . "'";
$result = mysql_query($sql, $link) or die("There was an error while trying to get your information.\n<!--\n" . mysql_error($link) . "\n-->");
if(mysql_num_rows($result) < 1)
 {
    $_SESSION['username'] = $_POST['username'];
    redirect('index.php?p=signup');
 }
$_SESSION['id'] = mysql_result($result, '0', 'id');
$_SESSION['fName'] = mysql_result($result, '0', 'fName');
$_SESSION['lName'] = mysql_result($result, '0', 'lName');
...

Herkes evet sorar önce ve ben gerçekten 'SELECT gerekiyor

Edit: hiçbir SQL injection olabilir böylece Evet, verileri sterilize ediyorum, bu kodu daha yukarı.

10 Cevap

Ben bu ile geldi ve çalışması için görünür.

while($row = mysql_fetch_assoc($result))
 {
    $_SESSION = array_merge_recursive($_SESSION, $row);
 }
It's not so much that it causing performance problems but that I would like the code to look a bit cleaner.

Daha sonra, bir sınıf olarak, kullanıcı verilerini sarın. Modifyng $ _SESSION doğrudan biraz kirli görünüyor. Eğer veri tutmak istiyorsanız bir sözlük hala ayrı bir sınıfta koymak bile yapabilirsiniz.

Ayrıca tüm sütunlar üzerinde dolaşır, onların isimlerini alır bir döngü uygulamak ve aynı anahtar isimleri ile bir harita verileri kopyalamak olabilir. Bu şekilde iç değişkenler adlı sözlük ve veritabanı sütun adlarında anahtar ile her zaman aynı olacaktır. (Bu aynı zamanda veritabanındaki sütun adını değiştirdiğinizde değişken adını değiştirme dezavantajı vardır, ama bu oldukça yaygın ve iyi kabul trade-off).

En verimli:

$get = mysql_query("SELECT * FROM table_name WHERE field_name=$something") or die(mysql_error());

$_SESSION['data'] = mysql_fetch_assoc($get);

Bitti.

Bu artık, bir dizi içinde depolanır. Yani bir alan sadece yapmanız adı olduğunu söylüyorlar:

echo $_SESSION['data']['username'];

Veri dizinin adıdır - username bu alanın değerini tutan .. dizi alandır.

EDIT: Bazı sözdizimi hatalar giderilmiştir: P ama fikir olsun.

Tamam, bu soruya cevap vermez, ancak mevcut kod SQL Injection açık bırakmaz?

Ben yanlış olabilir, sadece zil başladı SQL ve alarm çanları dizeleri kullanımı gördüm, PHP çalıştı asla!

Edit:

Ben yazı ile kurcalamak çalışıyorum değilim, ben bir yazım hatasını düzeltmek oldu, geri dönmez lütfen.

Sana "büyük miktarda veri" ne demek emin değilim, ancak yalnızca bir kullanıcı için veri başlatılıyor gibi bana bakıyor? Eğer öyleyse, ben onlara birkaç veri megabayt ile veritabanındaki sütun yüzlerce yoksa bu optimize etmek için herhangi bir neden göremiyorum.

Ya da, farklı koymak için, neden bu optimize etmek gerekiyor? Eğer performans sorunları yaşıyorsunuz?

Ne yapıyorsun şimdi düz ileri yaklaşım, ve ben gerçekten onunla bazı özel sorunları yoksa farklı yapmak için herhangi bir neden göremiyorum.

Bir kullanıcı nesnesindeki kullanıcı verilerini Sarma rağmen program yapısı bazı yardımcı olabilir. Lütfen giriş doğrularken da muhtemelen iyi bir fikir olduğunu.

@Unkwntech Looks like you are correct, but following a Google, which led here looks like you may want to change to mysql_real_escape_string()

Düzenleme gelince, ben efficient yazım yanı sıra kaldırıldı düzeltilmiş "nedir" .. konu says it all beri bu gerçekten gerekli değil beri.

Siz sorunuzun altındaki "edited a min ago" metni tıklatarak (güzel gerçek değişiklikleri vurgular) düzenleme geçmişini gözden geçirebilirsiniz.

Örneğin json kullanmayı deneyin:

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

Bu işlevin uygulanması o zaten ne yapıyor daha hızlıdır?

Does anyone else have trouble entering ] into markdown? I have to paste it in

Evet, dinlenmişti oluyor.

@Anders - there are something like 50-75 columns.

Bu aslında uygulamada performans sorunlarına neden olmadıkça Yine, ben optimize ile rahatsız olmaz. Ancak, performans sadece başlangıçta bazı verileri alma ve ihtiyaç duyulan gibi diğer sütunları tembel yükleme düşünün bir sorun olup olmadığını.

Örneğin json kullanmayı deneyin:

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

Edit Later you then json_decode the $_SESSION['data'] variable and you got an array with all the data you need.

Clarification:

Eğer yazmak kod satır sayısını azaltmak istiyorsanız json_encode ve json_decode kullanabilirsiniz. Söz konusu örnekte, bir kod satırı OTURUM dizi veritabanındaki her sütun kopyalamak gerekiyordu. Kodu yerine 50-75 hatları ile bunu yapmanın, bir dizeye tüm veritabanı kaydı json_encoding tarafından 1 ile yapabilirdi. Bu dize OTURUM değişkeni saklanabilir. Kullanıcı başka bir sayfaya ziyaret Daha sonra, OTURUM değişken tüm json dize vardır. Eğer o ilk adını bilmek istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

$fname = json_decode($_SESSION['data'])['fname'];

Bu yöntem satır kopya tarafından bir çizgi daha hızlı olmayacak, ancak kodlama kurtaracak ve sizin veritabanı veya kod değişikliklere daha dayanıklı olacaktır.

BTW Does anyone else have trouble entering ] into markdown? I have to paste it in.

Unkwntech önerisi gerçekten işe yaramazsa, ben şifreniz sütun bu alanlardan biri olacak çünkü, her şeyi kapmak değil böylece sizin SELECT deyimini değiştirmek öneririz.

Eğer oturumda bu şeyler tutmak için ihtiyacınız olup olmadığını gelince, neden olmasın diyorum? Eğer kullanıcı günlükleri (Ben bu farz ediyorum hiçbir?, Sonra bitmiş olacaktır) ne zaman DB kontrol etmek için gidiyoruz eğer planlıyorsanız, zaten siz de oturumda oldukça hassas olmayan bilgileri (adı gibi) saklayabilir kişinin ziyaret boyunca bu bilgiyi kullanarak.