PHP ile MySQL aranıyor

5 Cevap php

Ben bu olayın bilgi için benim mysql veritabanı seach ve başka bir sayfada sonuçları / içeriğini görüntüleyen bir metin kutusuna herhangi bir sanatçı / grubun adını girmek için bir kişi istediğiniz bir proje yapıyorum. Aşağıdaki kod (aşağıda) search.php gelen bilgi almalısınız benim index.php içinde. Ben her yere baktım ve ben bu işe yaramıyor neden emin değilim ve ne yapacağımı bilemiyorum. Yardım harika olurdu! (Ben gerçekten bu sınıf geçmek için gereken!) :)

(Index.php)

<form name="search" action="search.php" method="get">
    <div align="center"><input type="text" name="q" />
    <p><input type="submit" name="Submit" value="Search" /></p>
</form>

(Search.php)

<?php

//Get the search variable from URL

$var=@&_GET['q'];
$trimmed=trim($var); //trim whitespace from the stored variable

//rows to return
$limit=10;

//check for an empty string and display a message.
if($trimmed=="")
    {
    echo"<p>Please enter a name.</p>";
    exit;
    }

//check for a search parameter
if(!isset($var))
    {
    echo"<p>We don't seem to have a search parameter!</p>";
    exit;
    }

//connect to database
mysql_connect("localhost","root","password");

//specify database
mysql_select_db("itour") or die("Unable to select database");

//Build SQL Query
$query = "select * from events where artist_name like \"%trimmed%\" order by date";

$numresults=mysql_query($query);
$numrows=mysql_num_rows(numresults);

//If no results, offer a google search as an alternative

if ($numrows==0)
    {
    echo"<h3>Results</h3>";
    echo"<p>Sorry, your search: &quot;" .$trimmed . "&quot; returned zero results</p>";

    //google
    echo"<p><a href=\"http://www.google.com/search?q=".$trimmed . "\" target=\"_blank\" title=\"Look up ".$trimmed ." on Google\">
    Click here</a> to try the search on google</p>";
    }

//next determine if s has been passed to script, if not use 0
if(empty($s)) {
    $s=0;
    }

//get results
$query .=" limit $s,$limit";
$result = mysql_query($query) or die("Couldn't execute query");

//display what was searched for
echo"<p>You searched for: &quot;" .$var . "&quot;</p>";

//begin to show results set
echo "Results";
$count = 1 + $s;

//able to display the results returned
while ($row=mysql_fetch_array($result)) {
$title = $row["artist_name"];

echo"$count.)&nbsp;$title";
$count++;
}

$currPage = (($s/$limit) + 1;

echo"<br  />";

//links to other results
if ($s>=1){
    //bypass PREV link if s is 0
    $prevs=($s-$limit);
    print"&nbsp;<a href=\"$PHP_SELF?s=$prevs&q=$var\">&lt;&lt;
    Prev 10</a>&nbsp;&nbsp;";
}

//calculate number of pages needing links
$pages = intval($numrows/$limit);

//$pages now contains int of pages needed unless there is a remainder from diviison

if($numrows%$limit){
//has remainder so add one page
$pages++;
}

//check to see if last page
if (!((($s+$limit)/$limit)==$pages) && $pages!=1){

//not last page so give NEXT link
$news = $s+$limit;

echo "&nbsp;<a href=\"$PHP_SELF?s=$news&q=$var\">Next 10 &gt;&gt;</a>";
}

$a = $s +($limit);
if($a > $numrows){$a = $numrows;}
$b = $s + 1;
echo "<p>Showing results $b to $a of $numrows</p>";

?>

5 Cevap

Bir $ sembolü eksik. Bence

$var=@&_GET['q'];

Muhtemelen olmalıdır

$var=@$_GET['q'];

Eğer gerçekten bu olmalıdır bu durumda başvuru, istediğiniz sürece: (Eğer bir başvuru isterseniz hata bastırma bu noktada gerekli değildir, ancak kontrol etmelisiniz $ var bunu erişmeye çalışıyor önce ayarlanır)

$var=& $_GET['q'];

Ben biraz daha bu gibi yazmak için cazip olacaktır.

if (!isset($_GET['q'])) {
    echo"<p>We don't seem to have a search parameter!</p>";
    exit;
}

$trimmed = trim($_GET['q']);

if($trimmed=="") {
    echo"<p>Please enter a name.</p>";
    exit;
}

Sizin nerede fıkra goofy ... bunu değiştirmeyi deneyin:

NEREDE '% $ kesilmiş%' gibi ARTIST_NAME

Sadece kesilmiş koyarak "kırpılmış" dizesi olarak tam anlamıyla yorumlanacaktır. Ancak, çift tırnaklı dize kesilmiş değişken $ kullanarak gerçek değişkenin değerini verecektir.

Ilk önce kaçmak, bir sorguda değişken $trimmed kullanmak için. Aksi takdirde, komut SQL injection saldırılara karşı savunmasız olacaktır ve saldırganların veritabanına karşı hemen hemen her sorguyu çalıştırmak mümkün olacak. Bu sorun root olarak MySQL bağlantı olduğu gerçeği ile şiddetlenir. Hiç bir üretim ortamında bunu asla.

Ayrıca, bir dize, bir değişkeni genişletmek için, siz değişken adından önce $ karakterini içermelidir.

$trimmed = trim($var);
$escaped = mysql_real_escape_string($trimmed);
$query = "select * from events where artist_name like \"%$escaped%\" order by date";

Sizin kod hala her yerde görünüyor. Ben bu çalışma değildi ana nedeni. "Ve". Eğer kuyrukta onları kullanmadan önce değişkenleri kaçmak gerekir. mysql_real_escape_string kullanıyor olmalıdır kaçan en düşük şeklidir karıştırma olduğunu düşünüyorum ben 'd olsa PDO bakabilirsiniz öneririz.

<?php

//Get the search variable from URL

$var = $_GET['q'];
$trimmed = mysql_real_escape_string(trim($var)); //trim whitespace and escape the stored variable

//rows to return
$limit = 10;

//check for an empty string and display a message.
if($trimmed == "") {
    echo"<p>Please enter a name.</p>";
    exit;
}

//check for a search parameter
if(!isset($var)){
    echo"<p>We don't seem to have a search parameter!</p>";
    exit;
}

//connect to database
mysql_connect("localhost","root","password");

//specify database
mysql_select_db("itour") or die("Unable to select database");

//Build SQL Query
$query = "SELECT * FROM events WHERE artist_name LIKE %$trimmed% ORDER BY DATE";

$numresults = mysql_query($query);
$numrows = mysql_num_rows(numresults);

//If no results, offer a google search as an alternative

if ($numrows==0){
    echo"<h3>Results</h3>";
    echo"<p>Sorry, your search: &quot;" .$trimmed . "&quot; returned zero results</p>";

    //google
    echo"<p><a href=\"http://www.google.com/search?q=".$trimmed . "\" target=\"_blank"\ title=\"Look up ".$trimmed ." on Google\">
    Click here</a> to try the search on google</p>";
 }

//next determine if s has been passed to script, if not use 0
if(empty($s)) {
    $s=0;
}

//get results
$query .=" limit $s,$limit";
$result = mysql_query($query) or die("Couldn't execute query");

//display what was searched for
echo"<p>You searched for: &quot;" .$var . "&quot;</p>";

//begin to show results set
echo "Results";
$count = 1 + $s;

//able to display the results returned
while ($row = mysql_fetch_array($result)) {
    $title = $row['artist_name'];

    echo $count.'&nbsp;'.$title;
    $count++;
}

$currPage = (($s/$limit) + 1;

echo "<br>";

//links to other results
if ($s>=1){
    //bypass PREV link if s is 0
    $prevs=($s-$limit);
    echo '&nbsp;<a href="'.$PHP_SELF.'?s='.$prevs.'&q='.$var.'">&lt;&lt';
    echo 'Prev 10</a>&nbsp;&nbsp;';
}

//calculate number of pages needing links
$pages = intval($numrows/$limit);

//$pages now contains int of pages needed unless there is a remainder from diviison

if($numrows%$limit){
    //has remainder so add one page
    $pages++;
}

//check to see if last page
if (!((($s+$limit)/$limit)==$pages) && $pages!=1){

//not last page so give NEXT link
$news=$s+$limit;

echo '&nbsp;<a href="'.$PHP_SELF.'?s='.$news.'&q='.$var.'">Next 10 &gt;&gt;</a>';
}

$a = $s +($limit);
if($a > $numrows){$a = $numrows;}
$b = $s + 1;
echo '<p>Showing results '.$b.' to '.$a.' of '.$numrows.'</p>';

?>

Çad belirtildiği gibi onunla DB eylemleri gerçekleştirmeden önce girişini temizlik öyle beri Ayrıca, bir SQL enjeksiyon basit olurdu.

eklemeyi deneyin

 foreach($_REQUEST as $param => $value)
{
   $_REQUEST[$param]=mysql_real_escape_string($value);
}

This way you escape all the user input so the user cant tamper with the db. Read more about this method and sql injection in the docs here: http://us2.php.net/mysql_real_escape_string