Door
Dirk Coppens
op 30-04-2018 18:47
gewijzigd op 30-04-2018 19:07
4.883 views
Hallo,
Zou er mij iemand kunnen helpen AUB.
Want ik kom er niet uit.
Ik heb een tabel "gebruikers"
vb
sleutel naam
987654321 Dirk Coppens
123456789 Test
Ik heb een tabel "gelezen" waarin user_id en een news_id in staat
vb :
User_id news_id
123456789 5
123456789 9
987654321 9
987654321 3
Ik heb nog een tabel met news
vb:
ID Title
2 Libya Gingerly Begins Seeking Economic but Not Pol...
3 Pressed by U.S., Pakistan Seizes a Taliban Chief
4 Francis, Still Hobbled, Will Give It Another Try
5 Most Support U.S. Guarantee of Health Care
6 Google Courts Small YouTube Deals, and Very Soon
7 A Laptop With Vista That Seems Just Like a Fully U
9 Opportunists in Somalia
Wat is nu mijn probleem.
In tabel gelezen staan de gelezen berichten per gebruiker.
Ik wil enkel de records tonen van een gebruiker die nog niet gelezen zijn.
Toch loopt er nog steeds iets mis .
Als ik de listing krijg en ik duid er eentje aan dat gelezen is, komt het in de tabel gelezen, de listing past zich aan
maar het id nr in de listing is verdwenen.
zie hieronder : hier kan je de ID nr nog zien
` a 4 Francis, Still Hobbled, Will Give It Another Try
` a 6 Google Courts Small YouTube Deals, and Very Soon, a Larger
` a 7 A Laptop With Vista That Seems Just Like a Fully Upgraded PC
` a 2 Libya Gingerly Begins Seeking Economic but Not Political Reform
` a 3 Pressed by U.S., Pakistan Seizes a Taliban Chief
` a 9 Opportunists in Somalia 25-4-2007 World news
` a 5 Most Support U.S. Guarantee of Health Care
Ik heb id 2 aangeduid dat het gelezen is en dan krijg ik dit :
` a Francis, Still Hobbled, Will Give It Another Try
` a Google Courts Small YouTube Deals, and Very Soon, a Larger
` a A Laptop With Vista That Seems Just Like a Fully Upgraded PC
` a Pressed by U.S., Pakistan Seizes a Taliban Chief
` a Opportunists in Somalia 25-4-2007 World news
` a Most Support U.S. Guarantee of Health Care
als ik een volgende wil aanduiden kan dit maat hij neemt het ID 2 terug mee terwijl het een ander Id moet zijn.
Kan hier terug even geholpen worden AUB
Dank bij voorbaat.
[size=xsmall]Toevoeging op 01/05/2018 12:07:53:[/size]
$strSQL = "SELECT n.ID, n.Title, n.Posted, n.Category, n.Subcategory, n.SmallDescription, n.FullDescription FROM newsmain n LEFT JOIN gelezen g ON g.user_id = $sleutel AND g.news_id = n.ID WHERE g.user_id IS NULL ";
doet hij dit maar hij toont n.ID niet meer, blijkbaar zit hij ergens in de knoop ?
Dat vind ik vreemd, want als ik dezelfde query test blijft het id gewoon netjes staan zoals ik ook zou verwachten. Je zou nog kunnen proberen de WHERE g.user_id IS NULL naar WHERE g.news_id IS NULL te veranderen, voor het geval je tegen een bug in je mysql versie aanloopt.
[size=xsmall]Toevoeging op 01/05/2018 13:16:53:[/size]
Heb je de query ook al in een mysql console (of desnoods phpmyadmin) gedraaid om te zien of de velden wel zijn zoals je ze verwacht?
Als ik dit uitvoer in een mysql console loopt er niks fout.
Ik gebruik phprunner en daarin loopt het fout .
zie hieronder.
Description
Occurs before SQL query executed
Use this event if you like to modify default SQL query on the page.
Avoid editing strSQL parameter, modify strWhereClause and strOrderBy instead.
Parameters
$strSQL - SQL query being to be executed.
$strWhereClause - WHERE clause applied to the SQL query. Example: "active=1"
$strOrderBy - ORDER BY query applied to the SQL query.Example: "ORDER BY
LastName,FirstName"
$pageObject - an object of Page class representing the current page
function BeforeQueryList($strSQL, $strWhereClause, $strOrderBy, $pageObject)
{
$sleutel =$_SESSION["UserID"];
$strSQL = "SELECT n.ID, n.Title, n.Posted, n.Category, n.Subcategory, n.SmallDescription, n.FullDescription FROM newsmain n LEFT JOIN gelezen g ON g.user_id = $sleutel AND g.news_id = n.ID WHERE g.user_id IS NULL ";
Dus, ze geven aan dat je iets niet moet doen en je doet het dan toch? Lijkt me logisch daar dingen mis kunnen gaan. Ik zou zeggen vraag het aan de mensen van phprunner, want hier kan ik uiteraard ook niks mee.
Ik heb het gevonden, maar ik krijg nog een fout.
De fout is nu als er een gebruiker is zoals "FGH123" Krijg ik de foutmelding Unknown column 'FGH123' in 'where clause'
de query = select count(*) FROM `newsmain` where ID NOT IN (SELECT news_id FROM gelezen WHERE user_id = FGH123 )
Als ik een gebruiker maak met alleen cijfers lukt alles.
Er moeten even wat quotes omheen, en vergeet de escaping ook niet. Het is een goede gewoonte om altijd quotes te gebruiken, ook als het om getallen gaat.
Misschien was mijn uitleg niet goed .
Ik gebruik een inlog user als die allemaal cijfers zijn is er geen probleem, als er een letter in staat heb ik een fout.
de query :
SELECT ID, Title FROM news WHERE ID NOT IN (SELECT news_id FROM gelezen WHERE User_id = $sleutel)
$sleutel = de ingelogde user
user_is = varchar
gebruiker of $sleutel = varchar
Hoe kan het dan komen dat cijfers in de query goed zijn en letters niet ?
Blijkbaar heb je dan niet gelezen, want ik zeg volgens mij vrij duidelijk wat je moet doen: quotes om de waarde en escaping toepassen. Ik zeg er alleen bij dat dat OOK moet als het om cijfers gaat.
EDIT: of nog liever, gebruik prepared statements. Scheelt je een hoop kopzorgen en wanneer correct toegepast een lekke applicatie.
Op dit moment is deze query lek, en waarschijnlijk het meerendeel van je andere queries ook. Leuk als je je data wil lekken, minder leuk als anderen in je applicatie komen, om welke reden dan ook.