2016-05-20 16 views
0

Ich kann nicht herausfinden, warum diese SQL-Abfrage nicht funktioniert und warum es nicht nach dem Schlüsselwort von URL gefiltert wird.Warum funktioniert dieser SQL-Befehl nicht?

Hier ist mein Code:

include("menujednoty.php"); 
$hostname="localhost"; 
$username="kintrogorgo"; 
$password="password"; 
$keyword = $_GET['a.tovar']; 
$db = "jednoty"; 
$dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password); 
foreach($dbh->query ('SELECT a.tovar , 
(select sum(b.kusy) from jednotypredaj as b where b.tovar=a.tovar and b.co="prijem") as prijem_ks, 
(select sum(c.kusy) from jednotypredaj as c where c.tovar=a.tovar and c.co="predaj") as predaj_ks, kod 
FROM jednotypredaj WHERE 
(a.tovar LIKE '%$keyword%') as a GROUP BY a.tovar ORDER by a.tovar ASC') as $row) 
{  
    echo "<tr>"; 
    echo "<td>" . $row['tovar'] . "</td>"; 
    echo "<td>" . $row['prijem_ks']. "</td>"; //Tu by mali bit predane kusy 
    echo "<td>" . $row['predaj_ks'] . "</td>"; 
    echo "<td>" . $row['kod'] . "</td>"; 

    echo "<td>" . ($row['predaj_ks']-$row['prijem_ks'] . "</td>"); 
    echo "<td>" . (100/$row['prijem_ks']*$row['predaj_ks'] . "</td>"); 
    echo '<td><a href="3edit.php?tovar=' . $row['tovar'] . '">Zobraziť</a></td>'; 
    //echo '<td><a href="3test.php?tovar=' . $row['tovar'] . '">In Development</a></td>'; 
    //echo '<td><a href="3testtest.php?tovar=' . $row['tovar'] . '">In Development 2</a></td>'; 
+1

was funktioniert nicht gemein? http://stackoverflow.com/help/how-to-ask – e4c5

+0

Bitte fügen Sie 'php' zu den Tags hinzu. Bitte verwenden Sie eine parameterisierte Abfrage, um SQL Injection zu vermeiden '(a.tovar LIKE: Schlüsselwort ')' – Stavr00

+0

Verwenden Sie 'PDO :: prepare()' und 'PDOStatement :: execute()', um die Trennung von SQL und HTML zu erleichtern – Stavr00

Antwort

0

Die Zitate der SQL-Syntax brechen, neu zu schreiben als eine vorbereitete Erklärung zu erleichtern:

$stmt = $dbh->prepare('SELECT a.tovar , 
    (select sum(b.kusy) from jednotypredaj as b 
     where b.tovar=a.tovar and b.co=:received) as prijem_ks, 
    (select sum(c.kusy) from jednotypredaj as c 
     where c.tovar=a.tovar and c.co=:paid) as predaj_ks, kod 
    FROM jednotypredaj WHERE 
    (a.tovar LIKE :keyword) as a 
    GROUP BY a.tovar ORDER by a.tovar ASC'); 

$stmt->execute(array('received' => 'prijem','paid' => 'predaj','keyword' => $keyword)); 

foreach ($stmt as $row) { 
    echo "<tr>"; 
    echo "<td>" . $row['tovar'] . "</td>"; 
    ... 
0

Reconsider Ihre SQL-Anweisung, wie Sie können entweder laufen korrelierte Unterabfragen oder bedingte Aggregate. Auch Sie Tabelle alias, a wurde falsch positioniert, nachdem WHERE Klausel:

Correlated Subqueries (behält Einheitenebene Datensätze mit kod Spalte)

SELECT a.tovar, 
     (select sum(b.kusy) from jednotypredaj as b 
     where b.tovar=a.tovar and b.co='prijem') as prijem_ks, 
     (select sum(c.kusy) from jednotypredaj as c 
     where c.tovar=a.tovar and c.co='predaj') as predaj_ks, 
     a.kod 
FROM jednotypredaj as a 
WHERE (a.tovar LIKE '%$keyword%') 
ORDER by a.tovar ASC 

Conditional Aggregate (Gruppe von aggregierten Datensätzen w/o kod sofern nicht als eine Gruppe hinzugefügt)

SELECT a.tovar, 
     SUM(CASE WHEN a.co='prijem' THEN a.kusy ELSE NULL END) as prijem_ks, 
     SUM(CASE WHEN a.co='predaj' THEN a.kusy ELSE NULL END) as predaj_ks 
FROM jednotypredaj as a 
WHERE (a.tovar LIKE '%$keyword%') 
GROUP BY a.tovar 
ORDER by a.tovar ASC 

MySQL erlaubt möglicherweise kod in SELECT Klausel und nicht in GROUP BY Klausel Aggregat Abfrage, wenn Ihre Instanz hat die ONLY_FULL_GROUP_BY Einstellung ausgeschaltet, aber nicht empfohlen und nicht ANSI-SQL-konform.

Und wie erwähnt parametrisieren diese Abfragen in PHP-Skript, Binding String-Literale, die hilft, Quote-Handling und SQL-Injektion zu vermeiden.

+0

Ich weiß nicht, wie man wirklich irgendeinen Code benutzt, den du mir geschrieben hast. immer bekomme ich Fehler Parse-Fehler: Syntaxfehler, unerwartet 'prijem' (T_STRING) – kintro

+0

Es muss aufgrund Ihrer Angebote sein. Wenn Sie nicht parametrisieren, verwenden Sie doppelte Anführungszeichen um die gesamte SQL-Anweisung und dann einfache Anführungszeichen um die Literale: * 'prijem' *, * 'predaj' *, * '% $ keyword%' * – Parfait

+0

Vielen Dank für die Arbeit Jetzt – kintro

Verwandte Themen