php ve sql sorgusu başarısız

7 Cevap php

Bu kodu vardır

http://www.nomorepasting.com/getpaste.php?pasteid=22580

bu küçük ajax uygulamasının bir parçasıdır. Ben, $ sorgu atamak için daha iyi, daha verimli bir şekilde bilmek yerine farklı bir sorgu veya cümleleri eğer bir grup ile SQL her zaman kopyalamak olacaktır. Temelde sorgu tıklandığında linke bağlı olacaktır, ama ben mantık göstermek için nasıl emin değilim. $ Sonuç benim SQL sorgusu başarısız neden ben de emin değilim.

7 Cevap

UPDATE: Ben refactored koduna Eran işlevini entegre. NOT: Ben içine $ tablo değişkeni geçirerek düzeltilmiş ve sadece sorgu metni aramaz beri değiştirildi ama esas gerekli satırları döndürür!

MAIN MISTAKES:

  • hata 1: Eğer kodu sonları tüm durumlarda sorgu2'nin ile sorgu üzerine.
  • hata 2: LIKE '% $ sorgu%'% 'GİBİ =>' LIKE arasında eksik bir boşluk var ... Bu büyük olasılıkla çok kodunuzu tatili

OTHER ISSUES

  • güvenlik sorunu: sql injection tehlikesi, kullanım mysql_real_escape_string
  • \ N platform bağımsız: kullanım PHP_EOL
  • kısa yazma alternatif yol ise bloklar
  • Normal için kıvırcık parantez kullanırsanız konuda yapıları ve tüm bu yapılar

Burada bazı değişiklikler ile kodu, look at the comments:

<?php
session_start(); //ommit, no session var used

//use braces, always!
//you may write such statements with the short form like
if (isset($_GET['cmd'])) : $cmd = $_GET['cmd']; else : die (_MSG_NO_PARAM); endif;

$query = '';
//escpae your input - very important for security! sql injection!
if ( isset ($_GET["query"]))
{
    $query = mysql_real_escape_string($_GET["query"]);
}
//no need for the other part you had here

$con = mysql_connect("localhost", "root", "geheim");

if (!$con) : die ('Connection failed. Error: '.mysql_error()); endif;

mysql_select_db("ebay", $con);

if ($cmd == "GetRecordSet")
{
    $table = 'Auctions';
    $rows = getRowsByArticleSearch($searchString, $table);

    //use PHP_EOL instead of \n in order to make your script more portable

    echo "<h1>Table: {$table}</h1>".PHP_EOL;
    echo "<table border='1' width='100%'><tr>".PHP_EOL;
    echo "<td width='33%'>Seller ID</td>".PHP_EOL;
    echo "<td width='33%'>Start Date</td>".PHP_EOL;
    echo "<td width='33%'>Description</td>".PHP_EOL;
    echo "</tr>\n";

    // printing table rows
    foreach ($rows as $row)
    {
        $pk = $row['ARTICLE_NO'];
        echo '<tr>'.PHP_EOL;
        echo '<td><a href="#" onclick="GetAuctionData(\''.$pk.'\')">'.$row['USERNAME'].'</a></td>'.PHP_EOL;
        echo '<td><a href="#" onclick="GetAuctionData(\''.$pk.'\')">'.$row['ACCESSSTARTS'].'</a></td>'.PHP_EOL;
        echo '<td><a href="#" onclick="GetAuctionData(\''.$pk.'\')">'.$row['ARTICLE_NAME'].'</a></td>'.PHP_EOL;
        echo '</tr>'.PHP_EOL;
    }
}
mysql_free_result($result);
//mysql_close($con); no need to close connection, you better don't


function getRowsByArticleSearch($searchString, $table) 
{
    $searchString = mysql_real_escape_string($searchString);
    $result = mysql_query("SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME FROM {$table} WHERE upper ARTICLE_NAME LIKE '%" . $searchString . "%'");
    if($result === false) {
            return mysql_error();
    }
    $rows = array();
    while($row = mysql_fetch_assoc($result)) {
            $rows[] = $row;
    }
    return $rows;
}

// ?> ommit closing php tag
"SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME
FROM {$table} WHERE upper ARTICLE_NAME LIKE'%$query%'"

Sen upper fonksiyon parametreleri etrafında parantez koymak gerekir. Bu bilgiye değiştirmek ve çalışması gerekir:

"SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME
FROM {$table} WHERE upper(ARTICLE_NAME) LIKE'%$query%'"

Bir özelliği kullanmak için:

$result = mysql_query($sql_query) or die(mysql_error());

Alacağınız mysql hata ne tür görmek için.

Eğer böyle yapmalıyım nickf dedi.

ve SQL-Injection kesinlikle yatkındır:

wikibooks: http://en.wikibooks.org/wiki/Programming:PHP:SQL_Injection long article: http://www.securiteam.com/securityreviews/5DP0N1P76E.html

Eğer bir parametre olarak arama metnini kabul eden bir işlevi sorgu soyut olabilir. Gibi bir şey:

function searchQuery($text) {
	$text = mysql_real_escape_string($text);
	$result = mysql_query("SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME FROM {$table} WHERE upper ARTICLE_NAME LIKE '%" . $text . "%'");
	if($result === false) {
		return mysql_error();
	}
	$rows = array();
	while($row = mysql_fetch_assoc($result)) {
		$rows[] = $row;
	}
	return $rows;
}

Eğer (bunu yapmak için burada mysql_real_escape_string kullanılan ()) SQL enjeksiyon saldırıları önlemek için kullanıcı girişi kaçmak gerektiğini unutmayın. Sorgu başarısız olursa bu işlev aynı hata kodunu döndürür, böylece bir dizi ya da değilse görmek için sonucu kontrol etmelisiniz:

 $result = searchQuery($_GET['query']);
 if(!is_array($result) ) {
      echo 'An error has occurred:' . $result;
 } else {
   //iterate over rows
 }

Kaşlı ayraçlar {ile (IF / ELSE) mantıksal yapıları sarın. Bu okunabilmesi için daha iyi ve gereksiz hatalardan uzak durmanıza yardımcı olur.

Bunu her blokta sadece ilk ifadesi şartlı kalan allways, yürütülen övgü içinde IF / THEN / ELSE inşaatlarında ifadeleri kapalı değil.

$ Query2 muhtemelen tanımlı ise henüz çoğu durumda size $ sorguya $ Query2 atama olurdu.

Başka bir ipucu: Eğer girdiyi, bu gibi SQL kullanıcı girişini yapıştırarak gitmez, bu tehlikeli.

Senin gibi ve '% $ sorgu%' arasında bir boşluk gerekebilir. Ayrıca, mysql_error () fonksiyonu içine bakmalı - MySQL hata tam olarak ne olduğunu size söyleyeyim.