- sellerbuyer: Milyen laptopot vegyek? Segítek: semmilyet!
- MaxxDamage: Vizes Laptop Hűtés? Lehetséges? Igen!
- Luck Dragon: Asszociációs játék. :)
- Argos: Az vagy, amit megeszel
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- sellerbuyer: HDMI vagy DisplayPort kábellel szebb a kép?
- sziku69: Fűzzük össze a szavakat :)
- skoda12: Webshopos átverések
- Gurulunk, WAZE?!
- D1Rect: Nagy "hülyétkapokazapróktól" topik
Új hozzászólás Aktív témák
-
Taci
addikt
mysqli_real_escape_string
Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.
Ezzel kiegészítve a user inputokra akkor jobb lenne?Csak mert ahogy nézem, a base64_encode-ot utána dekódolni is kell, és így gondolom, a lényege ugyanaz lenne, csak "bonyolítva" (ha nem, javíts ki, kérlek):
$str = 'This is an encoded string';
echo base64_encode($str);The above example will output:
VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw== -
Taci
addikt
válasz
sztanozs #20676 üzenetére
Tehát ha a user hiába ad meg a linkelt példában lévő kártékonynak szánt inputot a $name változóhoz (a linkelt példában ez volt email címhez: bswan@microsoft.com'; DROP TABLE CustomerTable; PRINT 'Gotcha!'--), mindkét verzióval "védve vagyok"?
Ha igen, miért? (Ha 1-2 mondatban, vagy akár csak 1 magyarázó linkkel el tudnád mondani. - közben lentebb azt hiszem, meg is találtam rá a választ)
Ha jól értem, azért "kellene" az sqlsrv_query, mert:
When you execute this query using parameterized values and the same user input , only the INSERT query is executed.Viszont a Prepared Statement-tel (bind_param) is paraméterezek. Ezért lenne az a fajta verzió is "védett"?
Úgy látom, ez lehet az oka, igen ( [link] ):
A prepared statement is a parameterized and reusable SQL query which forces the developer to write the SQL command and the user-provided data separately. The SQL command is executed safely, preventing SQL Injection vulnerabilities.Köszönöm!
-
Taci
addikt
Sziasztok!
Az
sqlsrv_query
és abind_param
használata "kizárja egymást"?Eredetileg így néz ki egy lekérdezésem előkészítése (példa):
$sql = "INSERT INTO " . $table . " (id, name, date) VALUES (?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("iss", $id, $name, $date);
De most, ahogy olvasgatom, hogy kell megvédeni egy PHP-alapú weboldalt, és rátaláltam az SQL Injection Attacks-re, tippnek a
sqlsrv_query
használatát látom.És ha jól látom, ez alapján a fenti példával ez így nézne ki:
$sql = "INSERT INTO " . $table . " (id, name, date) VALUES (?,?,?)";
$params = array($id, $name, $date);
$stmt = sqlsrv_query( $conn, $sql, $params);
- A bind_param az ugye akkor kell, ha gyakori a lekérdezés, mert így hatékonyabb. De akkor ezek szerint ezzel is kijátszható a kód (SQL Injection Attack)?
- Ha pedig átváltok az ajánlott sqlsrv_query-re, akkor bár védve leszek az injection-támadások ellen, de bukom a bind_param (prepared statement) általi hatékonyságot?Vagy hogy van ez? Lehet/kell ezeket "mixelni"? Vagy elég csak az egyik, hogy mindkét előnyt (hatékonyság + védelem) megtarthassam?
Köszi!
Amúgy próbáltam az itt említett példán keresztül "megtámadni" az adatbázis, de sehogy sem fogadta el a Drop Table kódrészt (saját adatbázisra szabva, persze). Szóval nem tudom kipróbálni, melyik a jó megoldás.
-
Taci
addikt
válasz
nevemfel #20659 üzenetére
Ezt most amúgy én sem értem.
Ez működik, csak benne van pár p-tag a kinyert sztringben ($description):
$description = $node->getElementsByTagName('description')->item(0)->nodeValue;
Ezért akartam volna úgy, hogy "tovább bővítem" ezt a kódot, hogy az első p-tagek közti sztring részletet adja vissza, pl. így:
$description = $node->getElementsByTagName('description')->item(0)->nodeValue->getElementsByTagName('p')[0];
De ezt nem tudtam megoldani, mert csak vakon próbálkoztam, hogy hogyan kellene/lehetne folytatni.
Sztringvágással már megcsináltam, csak reméltem, lehet egyszerűbben/szebben is.
-
Taci
addikt
válasz
sztanozs #20655 üzenetére
De fura, teljesen meg voltam győződve róla, hogy egy sima getElementsByTagName lesz, nem gondoltam, hogy ez ennyire "lehetetlen" feladat php-ben, "szépen".
A forrás sajnos nem "megbízható", bármikor változtathatnak, ezért is szerettem volna a sztringek vágásánál egy "szebb" módot, mert ha ott változtatnak valami radikálisat (vagy akár kicsit is, de "rossz helyen"), akkor hibára futhat a kód.
De akkor maradok ennél. Köszönöm.
Neked is a választ, Mike. -
Taci
addikt
Adott egy hosszú XML fájl, abból egy részlet a következő:
<description><![CDATA[<p>Az eddig főként a rakétagyártásban jeleskedő Rocket Lab feladata az lesz, hogy két űreszközt is létrehozzon.</p> <p>The post <a href="https://ng.24.hu/tudomany/2021/06/17/maganvallalat-epithet-mars-szondakat-a-nasa-nak/" target="_blank">Magánvállalat építhet Mars-szondákat a NASA-nak</a> first appeared on <a href="https://ng.24.hu/" target="_blank">National Geographic</a>.</p>]]></description>
Magát a description-t így egyben szépen ki tudom szedni:
$description = $node->getElementsByTagName('description')->item(0)->nodeValue;
Viszont így jelenleg ezt tartalmazza ennél a példánál:
Az eddig főként a rakétagyártásban jeleskedő Rocket Lab feladata az lesz, hogy két űreszközt is létrehozzon.
The post Magánvállalat építhet Mars-szondákat a NASA-nak first appeared on National Geographic.
(Csak linkekkel, de azt most kiszedtem.)Nekem csak az első p-tagek közti rész kellene (Az eddig főként... létrehozzon.), az utána következő részek már nem.
Ezt hogyan tudom kiszedni, ugyanígy "szépen" (nem sztringekkel vágdosva)?
Tudnátok ebben segíteni?getElementsByTagName('p')
kellene valahogy valahova, csak nagyon nem találom, pedig biztosan egyszerű.Köszönöm.
-
Taci
addikt
Nem, nem curl-lel, hanem simán csak get_headers.
-
Taci
addikt
válasz
sztanozs #20634 üzenetére
Igazából én jelenleg a 200-at, a 301 és 302-t kezelem.
Az összes többit szeretném csak simán a logomba összeszedni, hogy ha olyan link kerül elő, amit máshogy kell kezelni, tudjam, hogy arra mit dobott - plusz a php error logot szeretném tisztán tartani, mert ha ott van bejegyzés, akkor azzal foglalkoznom kell.
Egy HTTP status code-dal vagy DNS hibával nem (kapott linkek, nincs ráhatásom, se a szerverjeik állapotára).Elképzelhető, hogy nem működő linket kapok, vagy a szerverrel van valami, és nincs header (így a
get_headers
hibára fut, ami így a php error logba kerül), de ezt a lehetőséget is szeretném lekezelni, hogy a saját logomba kerüljön.Hogyan tudnám megoldani?
Köszi. -
Taci
addikt
Hogyan tudnám "elkapni" a saját kódomban, ha egy oldal nem elérhető?
Adott pl. ezt a teszt oldal direkt erre a célra:
http://404.php.net/Az alap link-elérhetőséget tesztelő funkcióban a header-ből nyerek ki információt:
get_headers($url);
Ennél a linknél viszont ugye nincs header, így ez hibára fut, és a php error logjába ír:
get_headers(http://404.php.net/): failed to open stream: php_network_getaddresses: getaddrinfo failed: Nincs ilyen ismert állomás.Hogyan tudnám ezt a saját kódomban "elkapni", hogy ne kerüljön a php error logjába mint hiba, hanem csak számomra a saját logomban jelenjen meg, mint információ?
-
Taci
addikt
-
Taci
addikt
válasz
sztanozs #20628 üzenetére
Igen, erre jutottam én is. Még próbálom ezt meghegeszteni, mert sokkal kényelmesebb és menedzselhetőbb lenne, ha lenne 1 feldolgozó szkriptem, és azt hívná meg minden forrás - de hát már látom, hogy a vége az lesz, hogy mindegyik kap egy saját, testre szabott szkriptet, mert azzal, hogy kezelek egy nem standard-ként működőt, esélyes, hogy elrontom a többit (ahogy most is történik), amik meg amúgy tökéletesen, a standardok szerint működnek.
Köszi.
-
Taci
addikt
Beleraktam hibakezelést, ahogy írtad:
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
echo "ERROR: " . $error_msg;
}
Így viszont minden linknél ezt írja ki:ERROR: <url> malformed
De passz, hogy miért, minden url rendben van - legalábbis 100%, hogy ha van is hibás közte, nem mind az.
Ja, és amúgy meg gond nélkül dolgozik a linkek tartalmával.
Szóval így nem sokat ér ez a hibajelzés. -
Taci
addikt
válasz
sztanozs #20625 üzenetére
Nincs itt nagy baj, se tervezési hiba. (@polymorphin) Sok helyen van meghívva már a függvény, el akartam kerülni, hogy mindenhol át kelljen írni a paraméterezés miatt.
De ha aglobal
kerülendő (mi miatt amúgy?), akkor inkább átírom.@SUPREME7: Írtam is, hogy a global-lal próbáltam, de valamiért az egyik függvénynél/értéknél nem volt hajlandó működni. De mindegy is, nem is javasolt, meg inkább megcsinálom az átírást.
Köszi.
Amúgy az bonyolítja be nagyon nálam, hogy 23 db külső forrásból kell dolgoznom, és 24 féle képpen kezelik a dolgokat, amit nekem egy szkriptben kell lekezelni, és ez néha kuszává teszi.
Most a legtöbb probléma a következő miatt jött fel:
Írtam korábban, hogy ellenőriznem kellett, hogy valid linkekkel dolgozom-e. Ott ugye jött az átirányítás "problémája". Megoldottam.
De aztán jött az, hogycurl
-lel (is) kell dolgoznom ezeknek a linkeknek a tartalmán. És most pont az átirányítós probléma miatt jött fel egy újabb:
"failed to open stream: Redirection limit reached, aborting"Kiszedtem hát a header-ből a "Location" alól (persze ettől bonyolultabban), mert ugye így megvan a végső cím, és akkor nem lesz ilyen átirányítós probléma.
De aztán jött egy olyan forrás, ahol nemes egyszerűséggel a "Location"-be (már ha épp így írják, és nem csupa kisbetűvel) már nem a teljes átirányított linket rakják be (mert hát ugye miért is lenne egységes), csak a domain utáni részt. Pl. ha a domain https://www.oldal.hu/, és a "Location"-be csak annyi kerül, hogy "/aloldal/cikk.html".És ez mind abba a funkcióba kellett hogy kerüljön, aminek csak annyi dolga lett volna eredetileg, hogy valid-e a link vagy sem.
Na az ilyenek teszik egyre bonyolultabbá és kuszábbá a szkriptet. -
Taci
addikt
Talán így átláthatóbb és egyszerűbb a kérdésem:
$szoveg = "almafa";
function fuggveny1(){
echo $szoveg;
}
function fuggveny2(){
fuggveny1();
}
Hogyan tudom eljuttatni a $szoveg változó tartalmát (paraméterek használata nélkül) a fuggveny1-be, miközben azt előbb a fuggveny2-nek kell meghívnia, csak azon keresztül fut le?
-
Taci
addikt
Segítséget kérnék a következő témában:
így néz ki kb. az egyik php fájl tartalma:
$valtozo1 = "érték";
function fuggveny1($valtozo, "string"){
// dolgozzon a $valtozo-val és a string-gel
}
fuggveny1($valtozo1, "szöveg1");
Eddig minden oké.
Aztán ezután jön pár dolog, amivel nem boldogulok. Újabb függvények, amiben ezt a függvényt hívnám meg újra. Viszont paraméternek nem adhatom át.function fuggveny2(){
fuggveny1($valtozo1, "szöveg2");
fuggveny3();
}
És itt fontos, hogy a $valtozo1 az fix. Viszont nem viszi át az értékét a függvényen belülre.
Próbáltam global kulcsszóval, valamiért azzal sem:function fuggveny2(){
global $valtozo1;
fuggveny1($valtozo1, "szöveg2");
fuggveny3();
}
Aztán sajnos még tovább bonyolódott a dolog, mert jött egy másik függvény, amiben ez az előző van benne, így már duplán nem tudom, hogyan tudnám olyan "mélyre" (2 függvény mélységébe) bevinni a változót:
function fuggveny3(){
fuggveny1($valtozo1, "szöveg2");
}
Hogyan kell ezt megoldani, ha paraméternek nem adhatom át?
Hogyan tudok "külső" (függvényen kívüli) értékeket függvényen belül használni, akármilyen mélységben?A 3. függvényt a 2. hívja. Ha én használni akarok egy változót a 3. függvényben, ami teljesen kint van definiálva, akkor azt előbb be kell vinnem a 2. függvénybe, hogy aztán bevihessem a 3.-ba?
Nagyon nem értem ezt.
Köszönöm, ha el tudjátok magyarázni.
-
Taci
addikt
válasz
disy68 #20612 üzenetére
Sajnos ezzel sem működött (de köszönöm azért). Végül így sikerült megoldanom:
function file_get_contents_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
(Egy 100. oldalon lévő Google-találatban leltem.)
-
Taci
addikt
válasz
pelyib #20579 üzenetére
Sajnos nem igazán jutok előrébb vele, egyszerűen akárhány Google-találatot próbáltam végig a témára, nem tudtam használható eredményt produkálni.
Adott pl. ez a link:
https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje/A forrásából kellene nekem mondjuk a charset:
<meta charset="UTF-8">
Vagy egy kép linkje:<meta property="og:image" content="https://www.szeretlekmagyarorszag.hu/wp-content/uploads/2020/12/CSP_6335-másolat.jpg"/>
1)
Hogyan kell ezt kiszedni? (getElementsByTagName
-mel pl. Mert sztringként megvan, de az "nem szép megoldás")2)
Mivel az összes soron amúgy is végig megyek:$all_lines = file($feed_link);
foreach ($all_lines as $line_num => $line) {
//
}
Esetleg fel lehet ezt használni agetElementsByTagName
-mel (vagyByID
, vagy bármi, ami kell) kombinálva? Az sem baj, ha nem, csak ha már úgyis végigmegy minden soron, hátha.Köszönöm.
@bhonti: Köszönöm, igen, végül számomra is ez lett a konklúzió.
-
Taci
addikt
DOMDocument::load(): Extra content at the end of the document in xml_linkje, line: 1
Túl lett bonyolítva. Csak ezt a hibabejegyzést szeretném kezelni. Fogalmam sincs, mi okozta, valószínűleg "elírtak valamit" az xml-ben. (?) Innen jött az ellenőrzés ötlete, és onnan pedig minden más.De csak ezt szeretném kezelni, ha baj van az xml-el, akkor a foreach-ben kapjon egy continue-t (hibás fájllal ne dolgozzon), aztán majd javítják, a szkript meg pár perc múlva újra próbálja úgyis.
Ennek az 1 hibabejegyzésnek a kezeléséhez kérnek segítséget.
-
Taci
addikt
Na jó, ezt nem értem.
Csináltam egy eléggé overkill funkciót az ellenőrzésre:
function testIfValidURL($url){
$headers=get_headers($url, 1);
$url_valid_state = "";
if (stripos($headers[0],"200 OK")){
//URL Valid
echo "URL is Valid (200 OK): " . $url . "<br>";
$url_valid_state = TRUE;
return TRUE;
//exit();
} else if (stripos($headers[0],"301") || stripos($headers[0],"302")){
//URL Redirected (301 or 302)
echo "URL Redirected (301 or 302): " . $headers[0] . ". Checking Location link.<br>";
if (array_key_exists('Location', $headers)){
if (is_array($headers['Location'])){
//Array
echo "Headers Location type is array.<br>";
$location_count = count($headers['Location']);
echo "location_count: " . $location_count . "<br>";
$url_valid_state_check = 0;
foreach ($headers['Location'] as $headers_location_value){
echo "Checking headers_location_value: " . $headers_location_value . "<br>";
if(testIfValidURL($headers_location_value)){
$url_valid_state_check++;
return TRUE;
//exit();
}
}
echo "url_valid_state_check: " . $url_valid_state_check . "<br>";
if ($url_valid_state_check > 0){
$url_valid_state = TRUE;
} else {
$url_valid_state = FALSE;
}
} else if (is_string($headers['Location'])){
echo "Headers Location type is string. Checking.<br>";
if(testIfValidURL($headers['Location'])){
$url_valid_state = TRUE;
}
}
} else {
echo "URL header doesn't include Location. Setting URL valid state to FALSE.";
$url_valid_state = FALSE;
}
} else {
echo "URL status code is unknown: " . $headers[0] . ". Setting URL valid state to FALSE.";
$url_valid_state = FALSE;
}
return $url_valid_state;
}
Az eredeti linkkel próbáltam:
https://www.szeretlekmagyarorszag.hu/ime-a-tokeletes-toltott-kaposzta-receptje/A kimenet:
URL Redirected (301 or 302): HTTP/1.1 301 Moved Permanently. Checking Location link.
Headers Location type is array.
location_count: 2
Checking headers_location_value: https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje
URL Redirected (301 or 302): HTTP/1.1 301 Moved Permanently. Checking Location link.
Headers Location type is string. Checking.
URL is Valid (200 OK): https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje/
Mondom nagyszerű, nézzük meg egy direkt elrontott linkkel is, utána írtam egy 1-est:
https://www.szeretlekmagyarorszag.hu/ime-a-tokeletes-toltott-kaposzta-receptje/1A kimenet:
URL Redirected (301 or 302): HTTP/1.1 301 Moved Permanently. Checking Location link.
Headers Location type is string. Checking.
URL is Valid (200 OK): https://www.szeretlekmagyarorszag.hu/eletstilus/1-arany-5-ezust-2-bronz-es-8-olimpiai-kvota/
Hát ez az 1 arany 5 ezüst dolog hogy került oda?(Kínomban röhögök már.)
Kérem, valaki magyarázza el, mi történik itt.
Amúgy ha 123456-ot írok a végére, akkor meg megint a jó linkre dob tovább, és a korábban írt output lesz.Ez így megbízhatatlan, használhatatlan.
-
Taci
addikt
válasz
SUPREME7 #20606 üzenetére
Köszönöm, hogy rámutattatok erre, sok mindent kiderült a válaszokból, pl. az is, hogy nagyon rossz sorokban néztem a header tartalmát. De kerestem YT-videót, és már látom, mit néztem be.
Valóban 301 Moved Permanently.
Arra gondoltam, akkor a lenti/fenti (ki-hogy nézi) szrkiptbe (testIfValidURL) raknék egy olyan részt, hogy vizsgálná a header-ben, hogy ha át van irányítva, akkor mit csináljon.
Valahogy így:if (stripos($headers[0],"301") || stripos($headers[0],"302")){
//
}
Pár kérdés ide:
1) Az úgy látom kb. fix, hogy az első elemet [0] jó ha vizsgálom, így megkaphatom a result code-ot. (Ez ugye ha jól látom, asszociatív tömbnél is [0], tehát rakhatom aget_headers($url, 1)
-be az "1"-et, így is a [0] fogja a státusz sorát azonosítani?2) A "200 OK" az adott. A 301 után mindig Moved Permanently van, vagy néha más is? (pl. Redirect) Elég így vizsgálnom, ahogy fent van, simán csak a 301-re? (Bár itt elég egyértelműen fogalmaz: [link] Na de már nem törlöm ki ezt a pontot.)
3) Ahogy látom, a 302 is átirányítás, csak más fajta. Vizsgáljam ezt is, ki tudja, hátha egyszer pont ezen "akadna fent"?
Arra gondoltam, ha azt találja, hogy át van irányítva (301 vagy 302), akkor vizsgálja meg a header-ben lévő Location alatt lévő linket.
Pl. a töltöttkáposztásnál ez van benne:
Location: https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje/ (a félkövérben változott)És ha ott 200 OK van a headerben, akkor végülis sikeres a teszt.
Ezt az ellenőrzést kicsit trükkösebb volt, de végül úgy sikerült, hogy így hívom meg:get_headers($url, 1)
Tehát beletéve az 1-est, és így asszociatív tömböt ad vissza. Aztán azt is láttam, hogy a "Location" kell nekem, abban van, hogy hova irányít. De pl. a káposztásnál 2 eleme is van, szóval azt is vizsgálnom kell, ha több van benne.
Mert pl. amire elsőre irányít ($headers['Location'][0]), annak a végén nincs "/", a másiknak meg ($headers['Location'][1]) van. És az első újra 301, ami átdob a másodikra, és az végül már 200 OK.Szóval körülményesen, de meg lehet oldani.
Jól csinálom így? Vagy van egyszerűbb módja?Köszi az iránymutatást.
-
Taci
addikt
Illetve lenne még egy kérdésem.
Adott ez a szkript, amivel azt ellenőrzöm, valid-e a link:
function testIfValidURL($url){
$headers=get_headers($url);
return stripos($headers[0],"200 OK")?true:false;
}
Erre a (csak a példa kedvéért, a vasárnapi ebédhez előkészített) linkre miért mondja azt, hogy nem valid?
$feed_link = "https://www.szeretlekmagyarorszag.hu/ime-a-tokeletes-toltott-kaposzta-receptje/";
if (testIfValidURL($feed_link) === FALSE){
echo "nem valid. skip";
}
Kiírja, hogy:
nem valid. skipDe miért?
Megnézi a szkript a header-t, hogy tartalmazza-e a "200 OK" visszatérési értéket. És tartalmazza, nyilván, legalábbis a link megnyílik, és Chrome dev tools-ban is ott világít zölddel a Network tab alatt, hogyStatus Code: 200 OK
Vagy az a baja, hogy nem az első tömbelemben ($headers[0]) van?Ha így nem tökéletes a fenti szkript, hogyan módosítsam, hogy az legyen, hogy minden ilyen helyzetet lekezeljen?
Köszi.
-
Taci
addikt
Azt találtam, hogy van benne (a load()-ban) ellenőrzés is:
Returnstrue
on success orfalse
on failure.Szóval akkor valószínűleg így jó lehet:
$xmlDoc = new DOMDocument();
if($xmlDoc->load($xml) === FALSE){
echo "hiba az xml-ben (content not valid). skip<br>";
}
És utána dolgozhatok az $xmlDoc-kal tovább, mert az if-ben így már a feltöltés (load()) is megvolt az ellenőrzéssel együtt.
Legalábbis remélem, jól logikázok.
-
Taci
addikt
Sziasztok!
RSS feed-ből (XML) dolgozom. Eddig semmi (ilyen jellegű) gond nem volt, viszont ma észrevettem a következő hibabejegyzést a PHP error logban:
DOMDocument::load(): Extra content at the end of the document in xml_linkje, line: 1Erre a sorra mutatva:
$xmlDoc->load($xml_linkje);
Utána még pár perc múlva láttam újra a szkript újbóli futtatásakor, azóta nem.
Sajnos nincs ráhatásom, hozott anyagból kell dolgoznom.A kérdéseim ezek lennének:
1) Lehetséges, hogy rosszul generálták le az XML-t, valami hibás bejegyzés (tag) lehetett benne?
Az első sort említi, ott ez van:<?xml version="1.0" encoding="UTF-8"?>
(Aztán lehet, amikor futott, nem ez volt, hanem valami elrontva benne.)2) Az ideális az lenne, ha tudnám javítani, de ugye mivel egy fájlt millió helyen el lehet rontani, így leszkriptelni egy javító funkciót nem fogok tudni, ami 100%-osan mindig működne.
Ezért arra gondoltam, az is elég lenne, ha hibásnak találja az XML-t (mint a fenti php error logos bejegyzésnél tette (DOMDocument::load(): Extra content at the end of the document), akkor simán csak hagyja ki a vele való műveleteket, aztán majd következő futásnál ellenőrzi újra, hátha addigra javítják.
Hogyan tudom ezt az ellenőrzést megcsinálni? Fogalmam sincs, mit kell ezt vizsgálni, hogy "el lehessen kapni" ezt a hibát még a szkriptemben, és szépen lekezelni.
Biztosan van rá mód, hisz' a PHP error logban is elég specifikusan szerepel.Nyilván rákerestem, ezt találtam, de inkább kérdezek ilyen dolgokban, amik számomra teljesen ismeretlenek:
XMLReader::isValidEz lenne az? Van esetleg még más ajánlásotok a témában, mire figyeljek?
Pl.: Van értelme lementeni ezeket a fájlokat előbb, és lokálból dolgozni velük? Ha a load() beolvassa, azt a pár percet már csak "kibírja" lokálban tárolás nélkül is, nem?Köszi.
-
Taci
addikt
válasz
pelyib #20579 üzenetére
Sajnos közbejött egy másik probléma, szóval erre majd később térek vissza.
A PHP error log tele van a következő bejegyzésekkel:
Invalid argument supplied for foreach()És ami nem tetszik neki:
$dynamic_variable = "fix_part_" . $changing_value;
foreach (${$dynamic_variable} as $value){
}
Nem igazán értem, miért nem jó ez neki? Már csak azért sem, mert:
- amúgy működik rendben
- a pár sorral lejjebb copy-paste (csak más értékekkel) hívást nem említi az error logban.Vagy így kellene hívni, kihagyva a köztes változót?
foreach (${"fix_part_" . $changing_value} as $value){
}
-
Taci
addikt
Hogyan tudom egy weblap (HTML) forráskódjában lévő meta tag-eket összegyűjteni?
Adott egy link, ennek megvan a tartalma.
$all_lines = file($feed_link);
Más processzek miatt végig megyek minden során.
foreach ($all_lines as $line_num => $line) {
}
Most szembe jött egy rakat olyan link, amik forráskódjában a számomra szükséges adatok meta tag-ek "mögött bujkálnak".
Egyetlen egy (nagyon hosszú) sor, amiben többször van ugyanaz a típusú bejegyzés egymás után (plusz még sok más is). Nekem az összes ilyen kellene:<meta name="article:tag" content="Fotó">
(és még sok ilyen egymás után egy sorban, más content-tel)
És nekem azarticle:tag
-ekcontent
jei kellenének (itt pl. a "Fotó"), az összes.Meg tudom szerezni az adatot sztringekkel operáló lépésekkel, de kacifántos, és teljesen biztos vagyok benne, hogy van erre gyorsabb és egyszerűbb mód is. Sőt, az is teljesen biztos, hogy én is használtam már, de most nem lelem.
Találtam ilyet: get_meta_tags, de nem ezt használtam.
Talán
getElementsByTagName
volt, de most már össze vagyok kutyulva.Köszi.
-
Taci
addikt
Köszönöm, találtam sok cikket, fórumbejegyzést róla, amint a szolgáltatónál leszek, ki is próbálom, hogyan lesz a legjobb.
Azflock
paramétereit is megtaláltam (néhol "-n", máshol "-w 1" volt, nem volt tiszta, de így már értem):
[link]ha kézzel indítod írhatna más logba is, hivd paraméterrel
Ezt hogy érted? A kézzel indítást úgy értem, hogy magát a cron job-ot kézzel triggerelem.De így már nem piszkálom szerintem, a tesztfázisra így már rendben van, nem fog duplikálni.
Ésflock
-kal pedig ez a (korábban megírt) ellenörzős rész pedig nem fog már kelleni.Köszi a tippet.
-
Taci
addikt
válasz
pelyib #20569 üzenetére
Megcsináltam inkább így, ahogy már elsőre is mondtad, lényegesen egyszerűbb.
Futáskor készítek egy új fájlt (.running) ha még nincs. Ha van (és 10 percnél fiatalabb), akkor exit. Ha 10 percnél régebbi (beragadt), akkor törlés, újrakreálás, aztán a szkript tovább futtatása.
Szkript futása végén törlöm. -
Taci
addikt
Nagyon nyakatekert módon, de végül így oldottam meg:
0) Az ellenörző funkcióval kezdődik a szkript (lejjebb részletesebben, a 3. ponttól)
1) Logolás kezdetekor beszúr egy szöveget (pl. "Logolás kezdete")
2) Logolás végén ismét egy szöveg (pl. "Logolás vége")
3) Megvizsgálja a log fájlban a "Logolás kezdete" és "Logolás vége" sztringet ismétlődéseit
4) Ha megegyeznek (pl. 2 - 2 db), akkor az azt jelenti, hogy el lett kezdve, és le is lett zárva (azaz már nem fut), tehát indulhat újra a kód futása a szükséges feladatokkal.
5) Ha különböznek, akkor összehasonlítom a log fájl időbélyegzőjét, illetve a jelenlegi időbélyegzőt.
6) Ha kevesebb, mint a beállított limit (10 perc), akkor a php error.log fájljába ír, hogy ne módosítsa a szkript log fálját, de mégis legyen infóm arról, hogy megállt, nem fut tovább, és lássam az okát.
7) Amint 10 perc fölött van a különbség, attól függően, hogy a "kezdete" vagy "vége" sztringekből van kevesebb, beszúrja a logba a megfelelő sztringet a megfelelő mennyiségben, kvázi helyre állítva a logot.
Aztán fut tovább a szkript a normál módon, a kezdete és vége sztringek úrja párban vannak, megtörtént az esetleges szükséges "karbantartás" (ha mondjuk nem futott volna végig a szkript, és a "vége" bejegyzést nem tette volna meg).Egyszerűbb ötletem nem volt, és ezt most egyelőre bolondbiztosnak látom.
5 percenként fut a szkript, ha esetleg nem végezne a következő futtatásig, akkor nem indul, majd csak az azutáni 5. percnél.
Ha pedig valamiért nem futna végig (pl. szerverhiba), és elrontaná a log fájlt (és ezzel az ellenőrzést), max 10 perc múlva helyrehozza az ellenőrzéses szükséges sztringeket.Remélem, jó lesz.
-
Taci
addikt
Amíg tesztfázisban vagyok, néha el kell indítanom kézzel is egy szkriptemet (ami az adatbázist tölti fel), de amúgy Cron Job-ként fut (jelenleg csak óránként).
Már többször kiszúrtam magammal, mert akkor indítottam el, amikor pont futott amúgy is, így az aktuális bejegyzések duplán kerültek az adatbázisba, aztán mire felkutattam, hogy mi is történt, rengeteg időt elpazaroltam.Arra gondoltam, hogy futás elején ellenőrzöm a logfájl (amibe minden bejegyzés részlete bekerül) időbélyegzőjét és fájlméretét, aztán várakoztatom a szkript futását 5 mp-re, újra ellenőrzöm, és ha eltérés van, akkor a másodjára elindított példányt exit()-tel leállítom, hogy ne legyen "duplázás".
$log_file_filesize_check_start = filesize($log_file_custom_path);
$log_file_filemtime_check_start = filemtime($log_file_custom_path);
sleep(5);
$log_file_filesize_check_end = filesize($log_file_custom_path);
$log_file_filemtime_check_end = filemtime($log_file_custom_path);
De akárhogy csinálom, hiába altatom 10 mp-ig is akár, a _start és _end értékek mindig megegyeznek, pedig direkt nézem a fájlt, folyamatosan ír bele az első példány, így kell, hogy változzon a fájlméret és az időbélyegzője is.
Lehetséges esetleg, hogy ezek az értékek (filesize, filemtime) csak akkor realizálódnak majd magán a fájlon, ha a szkript már "elengedte" (tehát ha a bele logoló szkript már befejezte a futását)?
Ki szeretném védeni a duplikált bejegyzéseket (amik azért jönnek létre, mert duplán fut a szkript, mert a második példány akkor indul el, amikor az első még fut).
Ha esetleg a logfájl adatainak elemzésével nem érhetek célt, akkor keresek mást, de most már érdekelne ez a dolog.
Köszi.
-
Taci
addikt
Ezt találtam, de "csak" stackoverflow-ról így hirtelen:
"Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions."Amúgy nekem gond nélkül kiírja amit eddig kellett, a 300-as határt csak azért húztam, mert utána egyszerűen már túl sok, rengeteg helyet elfoglal a szöveg.
Illetve ezt találtam még:
VARCHAR(65535)
However, note that the limit is lower if you use a multi-byte character set:
VARCHAR(21844) CHARACTER SET utf8For CHARSET=utf8mb4 use VARCHAR(16383)
-
Taci
addikt
Köszönöm, már át is írtam, és valóban volt különbség.
VARCHAR(300)-ra van beállítva az egyik mező, és az egyik bejegyzésnél a korábbi "sima" strlen-es módszerrel szólt, hogy túl hosszú (~330), ezért levágta a túlcsorduló részt.
Azonban most megnéztem a forrássztringet, és valójában csak 298 karakter hosszú.
Átírtam a kódot mb_strlen-re, és így már nem bántotta, egyben volt kijelezve, hisz' elfért.Köszönöm.
-
Taci
addikt
ha UTF-8-at használsz akkor a multibyte extension legyen a php-ra felrakva, és strlen helyett mb_strlen-t kell használnii
SQL mezőben a
VARCHAR(255)
-ben a 255 ugye karakterszámot jelöl? Ezek szerint ha azt akarom vizsgálni, hogy egy beadott sztring ne lehessen hosszabb ennél, akkor eddig rosszul használtam?if (strlen($title) > 254){
$title = substr_replace($title, "[...]",249);
}
Mert akkor ezek szerint az strlen a karakterek által elfoglalt byte-okat számolja, míg az mb_strlen magát a karakterek számát?
Tehát akkor ezek szerint nekem így kellene használnom:
if (mb_strlen($title) > 254){
$title = substr_replace($title, "[...]",249);
}
Köszi.
-
Taci
addikt
Elvileg az str_split erre tökéletesen használható:
https://www.php.net/manual/en/function.str-split.php$str = "Hello Friend";
$arr1 = str_split($str);
print_r($arr1);
Array
(
[0] => H
[1] => e
[2] => l
[3] => l
[4] => o
[5] =>
[6] => F
[7] => r
[8] => i
[9] => e
[10] => n
[11] => d
)
-
Taci
addikt
válasz
sztanozs #20549 üzenetére
Köszönöm szépen a segítséget mindenkinek, sikerült "átállnom" utf8mb4-re.
Mivel még csak teszt adatbázis, ezért csináltam backup-ot minden táblából, módosítottam minden PHP kódot, amivel létrehozom a táblákat, és rendben létrejött minden a megfelelő formában, tartalommal feltöltve. Persze még tesztelnem kell alaposan mindent, de remélem, rendben lesz.
A keresésnél úgy döntöttem, nem kell az _as, mert ha valaki pl. angol billentyűzetkiosztással keres (vagy akárcsak mobilon is), nem fogja az ékezetes betűket beírogatni (mobilról én sem tenném).
---------------------------
Egy másik kérdés PHP-hoz kapcsolódóan:
Valószínűleg sokszor ki lett már tárgyalva, és a saját kutatásom (aka. Google-keresés) szerint nincs különösebb jelentősége, de:
Kell foglalkozni az egyszeres (fél-) idézőjel'
és a dupla idézőjel"
közti különbséggel?Az összes PHP kódomat a "normállal" írtam
"
- kivéve persze ahol pont mondjuk sztringbe akartam dupla idézőjelet írni.Azt tudom, hogy a dupla idézőjelesbe írt változók kiértékelődnek:
$s = "dollars";
echo 'This costs a lot of $s.'; // This costs a lot of $s.
echo "This costs a lot of $s."; // This costs a lot of dollars.
És biztos van még ilyen különbség. De a kódjaimat már megírtam, szóval már minden működik, úgyhogy ezzel a részével már nem kell foglalkoznom.
Szóval engem inkább az érdekelne, vagy van-e (nagy) jelentősége teljesítményben, ha a duplát
"
használom az egyes (fél)'
helyett?
Régebben biztosan számított, de a mai (és tegnapi) gépek és rendszerek teljesítményénél talán ez már egyáltalán nem fontos.
De azért inkább rákérdezek.Köszönöm.
-
Taci
addikt
válasz
pelyib #20545 üzenetére
Köszönöm a részletes választ!
Így már sokkal jobban rálátok erre az egész collation-dologra, ez az _ai _as, _ci _cs magyarázat különösen hasznos volt.
És így, hogy jobban rálátok, még több kérdés merült fel...Megtaláltam én is végül ezt a választ, amiből idéztél, és én is azt találtam, hogy ha úgy akarok keresni, hogy meg tudjam különböztetni az ékezetes betűket a nem ékezetesektől (_as), de nem számít, hogy kis- vagy nagybetű-e (_ci), akkor
utf8mb4_0900_as_ci
-t kellene használnom, ami viszont 8.0-tól elérhető csak.utf8mb4_bin
-nel igazából többet vesztenék a keresésen, mint nyernék, mert ez ugye binárisan hasonlít, tehát a kis- és nagybetűk meg lesznek különböztetve, ami egy keresésben nem szerencsés.Így a következő kérdéseim lennének:
1)
PHPMyAdmin-ban azt látom, hogy ami táblákat én csináltam, az mindutf8_unicode_ci
collation-nel készült, amit pedig a WordPress csinált, az mindutf8mb4_unicode_ci
.Így, hogy igazából a fentiek (és az egész dolog túlontúl bonyolult mivolta) miatt inkább lemondok arról, hogy megkülönböztessem a keresésben az ékezetes betűket az ékezet nélküliektől, van bármi értelme
utf8
-ról átállnomutf8mb4
-re?
Azon kívül, hogy emoji-téren future proof lennék.2)
Vagy inkább azt szeretném tudni, hogy elronthatok vele valamit? Ami kód működik, az most szépen működik. Elromolhat valami ezzel az átállással?
Pl. már nem is emlékszem hol olvastam, de azt írták, hogy ennél a típusú váltásnál vigyázni kell rá, hogy a mező karakterszáma mondjuk 255-re volt beállítva utf8-nál, akkor ez valójában kevesebb lesz utf8mb4-nél a 3 vs 4 byte miatt.Illetve itt írnak pár lehetőséget, hogy mi sülhet (és a témaindítónak sült is el) rosszul:
[link]3)
Ha jól látom, akkor ahhoz, hogy megfelelően hozzam létre a táblákat, ezeket kell csinálnom PHP-ben, ami intézi az SQL-es műveleteket:
-$conn->set_charset("utf8mb4");
(most utf8 van)
- a mezőre vonatkozó részekhez (VARCHAR):CHARACTER SET utf8mb4
- táblára vonatkozó részekhez:CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
(a _bin helyett ez jobb lesz a keresés miatt)Jól látom, hogy ezekre kell figyelnem? Vagy van még valami?
Köszi!
-
Taci
addikt
Úgy tűnik, ez a módszer (egyelőre) így már jó. Tehát adatbázisba (az idézőjelnél maradva) mindenképp a normál idézőjellel kerül, onnan amikor HTML-be kerül, már htmlspecialchars-szal megy.
--------------------
Viszont a kutakodás közben azt találtam, hogy utf8 helyett utf8mb4-et kellene már használni mindenütt.
Nekem minden php kódomban ez van jelenleg:
$conn->set_charset("utf8");
Úgyhogy ezt akkor át kellene írnom
$conn->set_charset("utf8mb4");
-re, gondolom.Viszont ezt az egész utf8 collation-témát nem értem.
Ott jött fel a téma, hogy keresésnél szeretném, ha meg lennének különböztetve az ékezetes karakterek a nem ékezetesektől, tehát csak arra keressen, amit beírnak a keresőmezőbe, ne hagyja le az ékezeteket ("Máté" vs "Mate").
Aztán jött a tipp sztanozs fórumtárstól, hogy talán rossz collate van beállítva a mezőre. De minél többet olvastam utána, annál jobban elvesztem.
Kéznél van esetleg egy átlátható magyarázat elmentve valaki kisokosába, hogy hol és hogyan kell ezt használni, beállítani?
Eleve a táblákat is már ezek használatával kell létrehozni? (Ilyen találatokat is kaptam.)
Vagy csak simán a lekérdezésnél? (Ezt próbáltam is, phpMyAdmin konzolban szépen lefutott, a kódból hívva már nem.)
Nem baj, ha újra kell építenem az adatbázist, inkább most nullázom le, amíg még csak teszt fázisban van az egész. De jó stabil, megbízható alapot akarok építeni.Szívesen átnézek és megtanulok én minden ide tartozó dolgot, de egyszerűen annyi féle válasz volt már előttem, hogy teljesen elvesztem köztük, és félek, ez egy olyan téma, amit ha most nem rakok össze rendesen, később vissza fog ütni.
Köszönöm az eddigi segítséget is.
-
Taci
addikt
válasz
nevemfel #20540 üzenetére
A forrássztringeket kapom, nem én készítem, és van, ami idézőjellel jön, van, ami "-tal, változó, nincs rá hatásom. Sajnos kezelnem kell tudni minden helyzetet. És ezek szerint most rosszul kezelem.
Hát ne kerüljön bele eleve "-tal.
Akkor megpróbálkozom azzal, hogy htmlspecialchars_decode-dal rakom adatbázisba, így minden ugyanúgy fog bekerülni. És akkor ezeket adom a kliensnek htmlspecialchars használatával, a többi meg a böngésző dolga.@Mike: Ahogy utánaolvastam, pár kommentben láttam, hogy pár speciális karakterrel "rosszul bánik" a htmlentities, míg a htmlspecialchars szépen kezeli. Köszi azért, hogy bemásoltad.
Just ran into a problem due to using htmlentities rather than htmlspecialchars! If your site is UTF8 encoded, special symbols like ¡™£¢∞§¶ get turned into little black diamonds with question marks in them because htmlentities doesn't know how to handle them, but htmlspecialchars does.
-
Taci
addikt
válasz
nevemfel #20535 üzenetére
Megcsináltam így, a
htmlspecialchars
-t csak megjelenítésnél használom, és ha idézőjellel"
kerül be az adatbázisba a szöveg, akkor a kliensnek már"
-tal adja át, amit aztán a böngésző szépen megjelenít újra idézőjelként"
.Viszont ha már eleve
"
-tal kerül be, akkor"
-ot is ír ki a böngésző. (Megnéztem, most már nem rakja bele az "amp"-ot, tehát normálisan"
van a kliensnek visszaadott értékben.)Ez nem a böngésző dolga lenne, hogy visszaalakítsa?
Vagy nekem kell valamit még csinálnom?
@Mike:
Esetleg a collation-ös dolgot? Mert ott ahogy pár hozzászólással lejjebb is írtam (túl bőven, tudom), nagyon nem érzem ezt a collation-témát, a keresésem azóta is kuka. (De ez most más téma.)Próbáltam így is:
htmlspecialchars($row["feed_description"], ENT_QUOTES, 'UTF-8');
De ugyanaz a végeredmény. (Az ENT_QUOTES itt most nem játszik szerepet, tudom.) -
Taci
addikt
válasz
nevemfel #20535 üzenetére
Aha, értem mire gondolsz, tehát amikor a kliens kéri a tartalmat (JS), és a PHP lekérdi az adatbázisból, amit megkap, arra hívjam meg a htmlspecialchars-t, és azt adjam vissza a kliensnek.
Amúgy ahogy nézegetem, azt is írják talán megoldásnak, hogy előbb a _decode függvényét kell meghívni, és így rendben lesz:
[link]$text = 'Your text with &s from the database';
// Decode and re-encode the special characters.
$text = htmlspecialchars(htmlspecialchars_decode($text));
Kipróbálom mindkettőt.
Köszi szépen a gyors választ!
-
Taci
addikt
Értetlenül állok a következő előtt:
A
htmlspecialchars
függvény az egyik szövegnél fura végeredményt adott, amit most vettem csak észre:Ez a bemeneti szöveg:
"Szöveg!"
(A felkiáltójelet csak azért hagytam ott, hátha szerepe van - bár szerintem nincs.)És ez került be az adatbázisba, miután a
htmlspecialchars
kezelésbe vette:&quot;Szöveg!&quot;
Mivel ezek a sztringek HTML-ben lesznek megjelenítve, ezért kell a
htmlspecialchars
, hogy a HTML által is használt karaktereket (ilyen az idézőjel) átalakítsa (az idézőjelet pont"
-ra), mert amúgy elrontja a HTML kódot.Viszont itt eleve a már "jó változatot" kapja meg a
htmlspecialchars
függvény, olvasatomban ezt nem kellene piszkálnia, az output is ugyanaz kellene legyen, mint az input.
De itt valamiért belerakja azamp;
karaktereket (ami ugye az "és-jel" (&) lenne, legalábbis az&
), ezzel elrontva az egészet. Nem is értem, hogyan és miért rakja oda, és miért nem az egészet, és miért a"
első karaktere után...És fura módon ezután a HTML által kijelzett kódban ez szerepel:
"Szöveg!"
Nem jelzi ki a belerakottamp;
karakteret, viszont nem is alakítja idézőjellé.Én rontok el valamit a használatánál?
$description = htmlspecialchars($feed[$x]['description']);
Van esetleg valami ötletetek?
-
Taci
addikt
válasz
sztanozs #20530 üzenetére
Ezzel a collation-dologgal most bekavarodtam.
Nézegetem, hogy mit kellene használni, és ezt a linket találtam:
http://mysql.rjweb.org/utf8mb4_collations.htmlItt kapásból néztem a két magyart:
utf8mb4_hu_0900_ai_ci
utf8mb4_hungarian_ci
De már az első karaktereknél látszik, hogy pl. A-betűnek kezeli az á-t is, és kb. minden hasonlót:
A=a=ª=À=Á=Â=Ã=Ä=Å=à=á=â=ã=ä=å=Ā=ā=Ă=ă=Ą=ąPlusz ugye mert _ci, case insensitive, tehát nem különbözteti meg a kis- és nagybetűket.
Tehát nekem a magyar-specifikus collation-ök nem jók. Ahogy nézem, ez lehet jó, hogy külön kezelje az ékezetes betűket:
latin1_general_ci
Itt külön van kezelve az "A" az "Á"-tól, bár jobban örülnék, ha ezeket együtt kezelné:
À=à Á=á
Mert simán kinézem, hogy néhány helyen még rosszul szerepelnek az ékezetek, így ezt sajnos külön kezeli, és ha a cikkben "àlom" van, a keresés az "álomra" (fordítva áll az ékezet) nem hoz majd eredményt. De ez legyen a legkisebb probléma, ezzel még együtt tudok élni.Jól látom, hogy a
latin1_general_ci
-t kell használnom, ha meg akarom különböztetni a keresést ékezetes karakterek alapján?Azt nem igazán találom, hogy az
utf8mb4_bin
hogyan működik ezekhez képest.----------
Ez a COLLATE parancsot amúgy jól használom? Vagy az adatbázis létrehozásakor kellett volna?
Mert ilyet is találtam:CREATE DATABASE Jira CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Én igazából "csak" keresni szeretnék, az ékezetes betűket külön kezelve.
De most ezzel eléggé bekavarodtam.Tereljetek irányba, kérlek.
Köszi.
-
Taci
addikt
SQL topikba tartozna így, off-ba is raktam, de annyira rossz a szemnek, hogy alig tudtam visszaolvasni, úgyhogy inkább kiszedtem off-ból.
Ez egyelőre csak egy lokál desktop server, és ami "vele együtt jött":
Kiszolgáló típusa: MariaDB
Kiszolgáló verziója: 10.1.37-MariaDB
A kiszolgáló karakterkódolása: UTF-8 Unicode (utf8)Hozzáadva a lekérdezéshez a collate-részt, phpMyAdmin konzolon belül a várt eredményeket adja.
COLLATE utf8mb4_bin
Viszont amikor az oldalon keresztül hívom meg (már ha jól használom egyáltalán), akkor hibára fut.
Ezt hívom meg:
SELECT * FROM table1
WHERE
((title LIKE '%alma%' COLLATE utf8mb4_bin)
OR
(desc LIKE '%alma%' COLLATE utf8mb4_bin))
UNION ALL
SELECT * FROM table2
WHERE
((title LIKE '%alma%' COLLATE utf8mb4_bin)
OR
(desc LIKE '%alma%' COLLATE utf8mb4_bin))
UNION ALL
SELECT * FROM table3
WHERE
((title LIKE '%alma%' COLLATE utf8mb4_bin)
OR
(desc LIKE '%alma%' COLLATE utf8mb4_bin))
ORDER BY time DESC
LIMIT 4
Ránézésre találtok esetleg valami hibát?
Megnéztem egy online SQL code checker-ben, azt írta, rendben van, csak nem optimalizált.Köszi.
-
Taci
addikt
válasz
sztanozs #20525 üzenetére
Most jutottam csak oda, hogy rá tudjak nézni, de valóban ott volt a hiba, megtaláltam, javítottam, működik. Köszi.
Most csinálom a keresést az oldalon.
Azt vettem észre, hogy alapból átkonvertál mindent ékezet nélkülire, oda-vissza.
Tehát ha arra keresek, hogy "alma", akkor dob olyan találatokat, amikben olyan szavak szerepelnek, mint pl.: "álmaink", "álmából" stb.
Mondjuk azt is kidobja, hogy "fájdalmak", de max akkor úgy keresek, hogy első karaktertől kezdve, vagy pedig szóköz legyen előtte, vagy vessző.
Hogyan tudom úgy indítani a keresést, hogy ha ékezettel írom be a keresőszót, akkor csak az ékezeteseket mutassa, ha pedig ékezet nélkül, akkor úgy?
Pl. beírom, hogy "édes", és kidobja, hogy "ezredes", vagy "verekedés".
Ez így nem jó.
Bár néha meg pont kapóra jön, mert pl. most rákerestem, hogy "kocsma", és kidobta azt is, hogy "kocsmáját", ami így pont szerencsés találat volt, de talán ez a ritkább.
Van valami bevált módszer a pontos(abb) keresésre?
De gyorsan ránéztem a példa kedvéért a Telex keresőjére, ott is inkább csak az ékezetekre figyelnek (ha "alma" a keresett szó, nem dobja azt, hogy "álma"), illetve néztem azt is, hogy ha "alma" a keresés, a "hatalma" nincs a találatok között, szóval gondolom úgy lesz, ahogy írtam, első karaktertől vagy szóköz után (vagy lehet még vessző, pont és pontosvessző is, hátha el van gépelve).
Köszi.
-
Taci
addikt
Fura, nagyon fura, de úgy látom, az volt pont a baja, hogy logoltam...
Át van irányítva a php error logja egy saját log fájlba, tehát a visszaadott eredményhez semmi köze, mégis, most hogy remark-oltam a logokat, hiba nélkül lefut...
És ezt amúgy már korábban is észrevettem több php szkriptnél is - viszont nem mindegyiknél... Fura.
A lényeg, hogy ez volt a baja, nem a lekérdezés vagy a változó átadásának módja. -
Taci
addikt
SELECT * FROM table1 WHERE category LIKE '%category1%'
UNION ALL
SELECT * FROM table2 WHERE category LIKE '%category1%'
UNION ALL
SELECT * FROM table3 WHERE category LIKE '%category1%'
ORDER BY date DESC
LIMIT 4
Ezt a lekérdezést szeretném futtatni. A PHP logja ezt a sztringet adja vissza, ez a lekérdezés. Átmásolom phpMyAdmin-ba, tökéletesen lefut. Szkripből viszont nem.
Esetleg az idézőjellel van baja? Mert annyi került bele pluszban (a WHERE category LIKE miatt), és előtte szkriptből is tökéletesen ment. Próbáltam amúgy a normál idézőjellel is, az is megy kézzel, de szkriptből nem.Mintha valami ilyesmi rémlene, hogy korábban volt már ilyen problémám, hogy PHP-ből nem így kell szringet átadni.
Így generálom a kategóriás részt:
$categories_to_insert = "'%" . $categories_exploded[0] . "%'";
Tudjátok esetleg, mi a hiba itt, és mi a megoldás?
Köszi.
-
Taci
addikt
Azt vettem észre, hogy ha fut az adatbázist feltöltő szkript (PHP) (főleg most, hogy van benne párszor meghívva 20mp-es sleep), akkor hiába mutatja a log, hogy már x db bejegyzést létrehozott, az adatbázis még üres, akárhogy frissítem. Egyedül akkor lesz csak (látható?) bejegyzés, ha végig futott a szkript.
Ez minden környezetben így van, vagy csak az én "teszt szerverem" (DesktopServer) működik így?
Vagy amíg nincs zárva az SQL-kapcsolat, addig a bejegyzéseket sem menti, csak "előkészíti", és maga az adatbázisba írás a kapcsolat zárásával realizálódna?
Tehát bármi ami a
$conn = new mysqli($servername, $username, $password, $dbname);
és a$conn->close();
között történik
(pl.$stmt = $conn->prepare($sql);
$stmt->bind_param(...
$stmt->execute()
),az csak akkor íródik az adatbázisba, ha megvolt a kapcsolat zárása?
-
Taci
addikt
válasz
SUPREME7 #20511 üzenetére
Közben találtam más kódolással is forrásfájlt, a logban egyből szemet szúrt a sok kérdőjel:
ISO-8859-2
Kell még számítanom másféle kódolásra is? Mert akkor úgy készítem fel a szkriptet.Amit találtam róla:
Megszületett az ISO-8859-1 (más néven Latin-1) karakterkészlet, amely a magyar nyelvből az ő és ű betűket nem tartalmazza, így alkalmatlan magyar szöveg ábrázolására. Megszületett az ISO-8859-2 (Latin-2), amely az összes magyar ékezetet tartalmazza, tehát lényegesen jobb, de a magyar tipográfiának megfelelő nagykötőjel és idézőjelek, valamint sok egyéb fontos szimbólum ebből is hiányzik. Születtek egyéb ISO-8859 kódlapok, a DOS által használt kódlapok (cp437, cp850, cp852 stb.), a Windows karakterkészletei (Windows-1250, Windows-1252 stb.) és sok-sok egyéb is.Ez alapján számítanom kell rá, hogy más is fel fog még bukkanni.
Az angolszász, majd az európai országokból kiindulva az ASCII után először az úgynevezett Latin-1 kódolás terjedt el, ami tartalmazza az összes angol nyelvhez szükséges betűt, illetve számos európai nyelv betűit, de például a magyar „ő” és „ű” betűket nem (ezek helyett – helytelenül – gyakran használják a hullámos illetve a kalapos betűket: û ô vagy õ). Magyarhoz lehet azonban a Latin-2 (közép-európai) kódolást is használni, ami ismeri az ő és ű betűinket, de nem ismer más fontos betűket, például a cirill, görög, vagy például az örmény, indiai, arab és héber betűket, a kínai írásjegyeket és a japán kanákat. A Unicode és az UTF-8 kódolás egyszerre támogatja mindezen karakterek megjelenítését, és így minden nyelv egységes kódolást tud használni, megelőzve a betűk nem tervezett „átalakulását”.
Ezek alapján akkor talán az
UTF-8
és azISO-8859-2
. Vagy van olyan "bátor" magyar oldal, aki bepróbálkozik a Latin-1-gyel?ISO-8859-1
(gyakran használják a hullámos illetve a kalapos betűket: û ô vagy õ --> Láttam már ilyeneket.)Még valami más esetleg? (Notepad pl. UTF-16-ba is enged menteni.)
Inkább leprogramozom most, mintsem később (újra) meglepjen.@Mike: Köszönöm, ezt nem is néztem, de UTF-8-on van, most ellenőriztem gyorsan.
Köszi!
-
Taci
addikt
válasz
SUPREME7 #20509 üzenetére
Ah, ez volt a megoldás, igazad van.
$return_keywords = mb_convert_encoding($return_keywords, "UTF-8");
De nem is értem, mert az összes forrásfájl headerjében ott van, hogy
<meta charset="utf-8">
Szóval így ez a kód UTF-8-ról UTF-8-ra alakít, nem?
Vagy jelen esetben lehet, hogy "elrontott UTF-8-ról" "jó UTF-8-ra". Bármit is jelentsen ez.Köszönöm a türelmeteket és a segítségeteket, és elnézést a sok-sok bejegyzésért.
Köszönöm! -
Taci
addikt
Azt látom, hogy a log fájl UTF-8 kódolásról indul, aztán amikor ezek a sorok belekerülnek, már ANSI-ra vált.
Átírtam mindkét sztringes részt arra, hogy
utf8_encode
-dal adja vissza az eredményét.Pl.:
$return_keywords = utf8_encode($return_keywords);
A visszaadott sztring még most sem jó
rendÅrség,pénzmosás,csalás,pest megye,bűncselekmény,eljárás,belföld
viszont a log fájl már UTF-8-as, és legalább a "belevésett" szöveget nem rontja már el.De hogy ezekkel a nem is tudom milyen karakteres sztringekkel mit lehet kezdeni...
ausztria,tirol,koronavÃrus,covid-19,teszt,külföld
Aztán kerestem, hogy mik lehetnek ezek a karakterek, és azt találtam, hogy pont hogy ezek az UTF-8-karakterek, így ezeket kell visszaalakítani. Így hát fogtam, és
utf8_decode
segítségével megnéztem, mire is megyek.Pl.:
$return_keywords = utf8_decode($return_keywords);
Amennyit javított (a sztringek már egy fokkal szebbek, de még mindig nem jók teljesen, pl. az "ő" betű helyett "?" van:
mindeközben,percr?l percre,világmindenség,univerzum
), annyit rontott is, mert a log fájl megint ANSI. Vagy már nem is tudom, mi-mi.
(kép -->kĂ©p
, töltve -->töltve
)Na ebben a karakterkészletes dologban most vagyok a teljes tanácstalanságnál.
-
Taci
addikt
válasz
nevemfel #20506 üzenetére
Igen, ilyesmi lehet. Most még 20mp / 20 lekérdezésen hagytam, de megnézem úgy is, ahogy mondod, hogy minden lekérdezés között 500-1000 ms, hátha annyi is elég.
Még egy korábbi témában viszont muszáj vagyok segítséget/tanácsot kérni:
Újra elő jött a össze-vissza karakterezés (az ékezeteseken).
Jelenleg 2 típusú sorból szedem össze a szükséges adatokat:1)
<meta name="keywords" content="mexikó, repülőgép, baleset, külföld" />
2)
<script>window.exclusionTags=['hamisítás', 'konténerhajó', 'hamis termék', 'Szellemi Tulajdon Nemzeti Hivatala'];</script>
Az első eredménye a
mexikó,repülőgép,baleset,külföld
sztring, a második pedig ahamisítás,konténerhajó,hamis termék,Szellemi Tulajdon Nemzeti Hivatala
.Ahogy ezek bekerülnek a logba (és az adatbázisba), máris borul minden, a log korábban helyes ékezetes betűi is össze-vissza lesznek.
Hogyan tudom ezeket úgy átadni, hogy ne zavarjanak be? Valószínűleg a karakterkészlettek kell bűvészkedni, de nem tudom, hogyan, mert azt sem értem, egy korábban jól működőt hogyan ronthat ez el.
Köszi.
-
Taci
addikt
válasz
nevemfel #20504 üzenetére
Na visszamentem szinte nullára, teljesen más irányból közelítettem, de a vége így is ugyanaz:
az Index-től csak 21 link tartalmát tudom leszedni egyszerre. Az Origo-tól az összeset.Egy kicsit részletesebben:
Az Index RSS feed-je 60 elemet tartalmaz, az Origoé 50-et. Ezeken én egyesével végigmegyek, a file() funkcióval pedig mindegyiknek a tartalmán.
Na az Origo az hagyja mind az 50 link megnyitását és szétszedését, de az Index 21 után "letilt".Bele raktam ezért 20-hoz egy 60 mp-es várakozást (sleep(60)), és utána hagytam folytatni. Ekkor már 26-ig ment el az Indexnél.
Aztán ezt a várakozást átállítottam 120 mp-re, és így végig ment az összes Indexes elemen is.Szóval a legtöbb problémát ez okozta, 1 teljes napom ráment ezt az Indexes "limitet" felderíteni.
Ezt hogyan lehet a legjobban kezelni? Van rá mód megállapítani, hogy hol van ez az Indexes "határ", hogy ki tudjam centizni?
-
Taci
addikt
válasz
nevemfel #20501 üzenetére
DesktopServer-t használok a tesztek és a fejlesztés időszakára.
Azt vettem észre, hogy talán onnantól ment félre a dolog, hogy beletúrok egy-egy link forrásfájljába, hogy kiszedjek pár infót belőle.
$all_lines = file($feed_item_link);
foreach ($all_lines as $line_num => $line) {
$keywords = '"keywords" content="';
if (!empty(strpos($line, $keywords))) {
$keywords_strstr = strstr($line, $keywords);
$keywords_strstr_substr = substr($keywords_strstr, 20); //ennek a hossza: "keywords" content="
$keywords_closing_stripos = stripos($keywords_strstr_substr, '"');
$keywords_result = substr($keywords_strstr_substr, 0, $keywords_closing_stripos);
$return_keywords_link = $keywords_result;
$return_keywords_link = str_replace(", ", ",", $return_keywords_link);
}
}
Ha ékezet nélküli adatot szedek ki (pl. linket), akkor nincs gond, ez a fenti kód tökéletesen működik. (nem pont ugyanez a kód, de a lényege ugyanez, csak más string-re keres, és nincs a végén replace)
Viszont azt vettem észre, ha van benne ékezet, akkor az egész kuka, a logtól az adatbázisig minden.Fura ami itt történik, mert pár bejegyzésre a PHP error.log-ja ezt dobja:
PHP Warning: file(https://index.hu/techtud/2021/03/27/allatok-oroszorszag-leopard-nagymacska/): failed to open stream: HTTP request failed!
A link srting-ként van átadva, szóval ez a valóságban file("link")-ként néz ki, de így logolja valamiért. Egyik csatornán működik mindre, másik csatornán mindig csak az első 21-re. Már a hajam tépem, nem értem.
------------
Szóval igazából ez 2 probléma:
1) Ha ékezetes tartalmat szedek ki, az hazavágja a logot és az adatbázis ezen részét is. De ez sem mindig, mert láttam már ékezetes tartalommal a logot és az adatbázist is. De valamiért valahol néha hibázik, csúnyán.2) Az
$all_lines = file($feed_item_link);
nem mindig ad vissza eredményt. Lehívom 60 linkre, abból 21 jó lesz, a többi nem. Lehívom a rosszul sikerült 49-re, abból 21 megint jó lesz.
De ugyanez egy másik csatornával (Index.hu helyett Origo.hu) meg csont nélkül viszi az összeset elsőre. -
Taci
addikt
Tegnap este (vagy ma hajnalban, már nem emlékszem, összefolynak az órák) a PHP egyszer csak "elfelejtett magyarul", nem kezeli az ékezetes betűket.
Korábban tökéletesen működött, de mostanra megkergült. Adatbázisba is rosszul (csúnyán, ékezetek nélkül) ír be, és a logot is teljesen elrontja.
Nem változtattam semmit a kódnak ezen a részén. Ami pl. eddig fixen bele volt égetve a kódba, hogy írja a logba azt, hogyKiválasztott elem
, az mostKiválasztott elem
.
Kategória --> KategĂłria
kép --> kĂ©pPHP version 7.3.1
A gyakorló teszt szerveren ez van. Lehet ez a régebbi verzió az oka? Bár nem tudom, akkor eddig miért működött, és most miért nem.
Óraátállítás? Más nem jut eszembe.Hátha nektek van ötletetek.
Köszi. -
Taci
addikt
válasz
instantwater #20355 üzenetére
Nem, dehogy.
Úgy értettem, hogy keretbe foglalják a tartalmat (a feed-et).
-
Taci
addikt
válasz
instantwater #20353 üzenetére
Nem, ez egy teljesen saját, 0-ról kezdve, üres lapról (plusz egy HTML template-ről). Egyelőre csak egyetlen egy oldal, két oldalon és felül fix "kerettel" (opciók, menük, kereső stb.), középen pedig egy "feed", ahova folyamatosan tölti be (görgetéssel) a bejegyzéseket.
Igazából nem értek semmihez sem, de programozni szeretek, és ebben a "projektben" is kellett rengeteget HTML-lel, CSS-sel, PHP-vel és JS-tel foglalatoskodnom, amit amúgy élvezek is.
A korábban ajánlott Moments.js helyett is inkább megírtam magamnak az időbélyegző formázó kódját - addig is gyakorolok. Úgyhogy megpróbálom ezt is. Köszönöm! -
Taci
addikt
válasz
instantwater #20351 üzenetére
Hmm, most hogy így mondod, az is bőven jó lenne akkor, ha a szerver csak a bejegyzésekhez kapcsolódó adatokat küldené át (aktuális bejegyzés képének linkje, bejegyzés szövege, bejegyzés időpontja stb.) (és ezeket az adatokat sokkal egyszerűbben is lehetne átadni asszociatív tömbbel), aztán ezt a kliens rakná össze egy JS-tel lokálban generált HTML kóddal? Teljesen felesleges ugyanazt a fix html kódot utaztatni szerver és kliens között, az mindig ugyanaz, nem változik, csak az a pár bejegyzésenként módosuló változó.
Ez esetben pedig akkor vagy a JS-be kell "beleégetni" a html kódot, vagy itt is lehet külső fájlból, gondolom. Na ezeknek mind utána nézek most, hogyan lehet, hogy a jobb. Köszi a rávilágítást, erre nem is gondoltam még eddig!(És ha most is rosszul, kérnék egy kijavítást.
)
-
Taci
addikt
Nem örököltem meg semmit.
Volt egy ötletem (weboldalra), elkezdtem hát nulláról tanulni, mit-hogyan kell megcsinálni, így jutottam ide. Szóval igazából amiket írtok, az nekem teljesen ismeretlen, úgy olvasok utána mindennek.
Ez a betöltött fájl amúgy eredetileg php volt (az is még eredetileg a "fő php" kód része, de gondoltam, "szebb" külön szedve, ezért jött a required), viszont minden sort
echo '
-val kezdtem (és';
-vel zártam) aztán később olvastam, hogy az úgy nem "szép", szóval maradt a html kód, és ahova adatbázisból kellett érték, oda került csak bele a html kódok közé a php kód (<?php
és?>
közé). Aztán mivel így már igazából html kód lett, átneveztem .php-ről .html-re.
Itt a leírásod alapján akkor nem jó a file_get_contents(), hiszen van benne szerver oldali (php) szkript.Na de próbálok utánaolvasni mindennek, amit írtál, és megnézni, ezt én hogyan tudom megoldani "nálam".
Köszönöm.
-
Taci
addikt
Akár egész weblapot is leküldhetsz. Azzal az a trükk, hogy fogod az egész weblap stringet, és base64 encode-olod.
Ebben kérnék most segítséget.Adott egy PHP kód, amiben megtörténik a lekérdezés az adatbázisból. Ez a PHP kód require-rel behúz egy külső HTML fájlt (
require 'feed_item.html';
) , amiben vannak PHP kódrészletek, oda tölti be a lekérdezésből származó adatokat. Aztán ez az egész megy (jelenleg) a kliensnek megjelenítésére.Hogyan tudom ezt a lerkédezésből származó kóddal feltöltött, külső fájlból behúzott HTML kódot asszociatív tömbbe rakni?
Maga a tömb:
$website_data = array();
$number_of_query_items = $result_count->num_rows;
$website_data['numberOfQueryItems'] = $number_of_query_items;
//$website_data['content'] = ide jönne az adatbázisból feltöltött html kód
$website_data_json = json_encode($website_data);
Köszönöm!
-
Taci
addikt
@coco2, pelyib, instantwater: Köszönöm szépen a tanácsokat!
Van minek utána néznem... Igazából 0-ról kezdtem már egyből ezzel az ötlettel, amit próbálok megvalósítani, és a w3schools oldaláról kezdtem tanulni. Ha valami probléma jött fel, elsőnek ott kerestem választ, aztán Stackoverflow, aztán Google, aztán itt.
De elég sok mindent át kell írnom akkor ezek szerint.
Ez a Moment.js nagyon hasznosnak tűnik, ugyanezt programoztam le PHP-ben, csak ott azzal bajlódtam a végén, hogy folyamatosan frissítse az adott elemen az időt (ahogy írtam is lejjebb). De ezzel egyszerűbb lesz sokkal, úgy látom.Az axios alatt gondolom, ezt értitek: https://github.com/axios/axios Még csak soha nem is hallottam róla (ami nem meglepő, kb. 2 hónapja írtam először HTML kódot is...
). Remélem, hamar rájövök, hogyan tudom a mostani kódot átírni úgy, hogy ezzel működjön.
Ha jól értem, akkor ehelyett:var numberOfQueryItems = 0;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (this.readyState==4 && this.status==200) {
document.getElementById("output").innerHTML=this.responseText;
}
}
xmlhttp.open("GET","frontend.php?q=" + valtozo,true);
xmlhttp.send();
kell valami ilyesmire átírnom:
const axios = require('axios');
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});
Aztán akkor még át kell írnom azt is, hogy a szerver asszociatív tömbben küldje át a megjelenítendő weblaprész adatait, plusz az egyéb változókat, amire szükség van.
https://www.w3schools.com/php/func_json_encode.asp
https://www.w3schools.com/php/func_json_decode.asp
Mondjuk még nem igazán látom át, a mostani kódból hogyan kell a kívánt eredményt létrehozni, de remélem, rájövök. (Ha esetleg mégsem, kérdezek majd. Bár nem szeretek, csak ha nagyon muszáj.)Nem egy pár órás munka (nekem), de remélem, boldogulni fogok.
Köszönöm a tanácsokat még egyszer!
-
Taci
addikt
Azt mondjátok meg, kérlek, hogyan lehet PHP-ből adatot átadni JS-nek?
Adott egy JS, amiben egy XMLHttpRequest-tel adatot küld a szervernek, és válaszként (this.responseText) megkapja a megjelenítendő HTML kódot.
Ugyanebben a PHP fájlban generálódik a tegnap tanácsolt módon a lekérdezett adat sorainak mennyisége is.
$number_of_query_items = $result_count->num_rows;
Ezzel az adattal kellene az említett JS-ben számolni, átadni a JS-ben szereplő változó értékének:var numberOfQueryItems;
Viszont nem tudom, hogyan kell átvinnem PHP-ből JS-be. Az XMLHttpRequest miatt átmegy sok adat, de nem tudom, hogy abból kellene-e valahogy kihalásznom ennek a változónak az értékét, vagy arra egy külön XMLHttpRequest-et indítani?
Nagyon nem találom a helyes választ rá, és ez megakasztott.
PHP-ben a változó, amit át kellene adni JS-nek:
$number_of_query_items = $result_count->num_rows;
JS-ben a PHP kóddal kommunikáló rész (leegyszerűsítve):
var numberOfQueryItems = 0;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (this.readyState==4 && this.status==200) {
document.getElementById("output").innerHTML=this.responseText;
}
}
xmlhttp.open("GET","frontend.php?q=" + valtozo,true);
xmlhttp.send();
Ezen a kódon keresztül kellene? Vagy más módja van ennek?
Az kellene, hogy a PHP kódban szereplő
$number_of_query_items
értékét megkapja a JSvar numberOfQueryItems
változója.Hogyan tudom ezt elérni?
Köszönöm!
-
Taci
addikt
document.querySelectorAll
lesz valószínűleg a barátom.
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_document_queryselectorall_class -
Taci
addikt
Sikerült megoldani, köszönöm!
Viszont lesz még egy kérdésem ezzel kapcsolatban, de azt egy külön kommentben tenném majd fel, mert egy picit hosszabb.
Itt viszont még megkérdezném ezt:
Van több elem a lapon (0-tól végtelenig), és mindegyik bejegyzésnek van egy időpontja, amivel számolnom kell. Szeretném mindegyiknél pontosan kijelezni, hogy mennyi ideje lett bejegyezve. Ez a számolás már nagyon szépen megvan PHP-ben végig vezetve. Viszont fix időponttal számol, amikor betöltődik az oldal, azt veszi "most"-nak, azzal számol, azt jelzi ki.
Viszont szeretném az aktuális időhöz igazítani (elég a kliens ideje, nem kell time server).
Így arra gondoltam, hogy miután kijelzi az időpontot a PHP kóddal, utána simán csak futtatok egy JS szkriptet, és másodpercenként emelem az időpontot 1 mp-cel. És így úgy-ahogy meg is vagyok, az ebben lévő pontatlanság bőven megfelel a célnak. (De időközben rájöttem, hogy az egész formázós PHP kódot kell hogy futtassam külön újra és újra...)Találtam is egy egyszerű példát ehhez, amivel tudok dolgozni:
https://www.w3schools.com/js/tryit.asp?filename=tryjs_setinterval2Szépen is működik, csak előjött egyből az a gond, hogy csak az első elemnél csinálja meg ezt a frissítést (és a saját kódomban csak a következő 4 elem betöltése után indul el, első betöltésre nem - de ez majd kifilózom logokkal, hogy miért) , az összes többinél már nem.
Tehát ha a példakódban pl. még pár sorba beszúrom hogy<p id="demo"></p>
, akkor is csak az elsőnél történik meg a frissítés, ott fut le a szkript.
Pedig azt szeretném, hogy több helyen is lefusson, bárhol, bármikor.Rátaláltam az infóra, hogy HTML-ben az ID-knak egyedinek kell lenniük, így a fenti példakódnál csak az első "demo" ID-t használja, utána már nem valid. A getElementById így nem jó. Esetleg valami más getElementBy?
Hogyan tudom ezt megcsinálni, hogy az összes bejegyzésnél fusson a szkript, ugyanaz a szkript, de persze mindegyiknél a saját adatokkal?Köszönöm!
-
Taci
addikt
válasz
instantwater #20326 üzenetére
Köszönöm a gyors és hasznos választ!
Kialszom magam, és holnap munka után újra nekiülök, átnézek minden lehetőséget.
-
Taci
addikt
Lenne ismét egy kérdésem, ami a tapasztalatlanságomból ered.
Nyilván mind a pagination-nek és az infinite scroll-nak is át kell adnom, hogy mennyi elemmel fog dolgozni, hogy feleslegesen már ne próbáljon meg sorokat betölteni, ha egyszer elfogytak.
Jelenleg a php kódban csak annyi van, hogy
if ($result->num_rows > 0) {
// a tartalom megjelenítése
} else {
echo "Elfogytak az elemek."; // random szöveg csak magamnak
}
A JS függvény pedig újra és újra visszatér, hogy (jelenleg négyesével) betöltse az új sorokat. Egy idő után viszont elfogynak, viszont a JS függvény ilyenkor is kapcsolatot létesít, megtörténik az SQL lekérdezés is - szóval ez már csak forráspazarlás. (Még ha szemmel ez nem is látszódik, ha remarkolom az "Elfogytak az elemek" echo-t.)
Így hát arra gondoltam, hogy ha már a JS pont ezt a PHP kódot hívja meg, amiben az SQL lekérdezés is van, így át tudom adni neki, hogy a lekérdezésben mennyi sor szerepel, így a JS-ben be tudom állítani, hogy ha a végére ért, akkor ne kérdezzen többször.
Na igen ám, viszont a lekérdezésbe ugye belekerült a LIMIT is (jelenleg "LIMIT 4"), így a sorok számára mindig 4-et ad vissza (kivéve, amikor már nincs annyi benne vagy teljesen elfogytak belőle).
$sql = "SELECT * FROM table ORDER BY order_by DESC LIMIT x OFFSET y";
(csak a példa kedvéért így írva most, mert amúgy prepare-rel van)Szóval ezt hogyan lehet szépen és hatékonyan megoldani?
"Tudja" ez a lekérdezés, hogy eredetileg milyen sorokat tartalmazott, mielőtt alkalmazta volna a LIMIT-et és a többit?
Ki lehet belőle szedni valahogy csak aSELECT * FROM table
értékét?Vagy mindenképp kell egy külön lekérdezés?
Már erre esetre is megvan a tervem, csak hátha van erre valami egyszerűbb, jobban bevált módszer. Mert ha máshogy nem, akkor megcsinálom a külön lekérdezést, és csak akkor újra futtatom le újra (ezt a külön lekérdezést az eredeti, "szűretlen" méretről), ha a "table" értéke változik. A többi nem fog változni, a table viszont elég gyakran.Köszi!
-
Taci
addikt
válasz
sztanozs #20321 üzenetére
Ezt találtam eddig a legjobb példának, ami alapján remélhetőleg meg tudom csinálni a saját változatomat:
https://codepen.io/timseverien/pen/XXYaZe -
Taci
addikt
válasz
sztanozs #20319 üzenetére
kell egy prepare persze még bele
Ahh, annyit szenvedtem vele, hogy végig hibaüzenetet dobott (Call to a member function bind_param() on bool), mert nem tetszik neki a lekérdezés. De nem tudtam rájönni, mi a baja, mert adatbázisban futtatva (és a "?" paramétereket átírva persze) tökéletesen futott.
Aztán így 2 óra szenvedés után végül arra jutottam, hogy teljesen lecsupaszítom és visszakövetem a kódot, és végül rájöttem, hogy táblát nem lehet paraméterezni, azon halt el végig...
"SELECT * FROM ? ORDER BY ? DESC LIMIT ? OFFSET ?"
Ott FROM utáni paraméternél csúszott el. De így végre megvan.De így összerakva már működik az infinity scroll-szerű megoldásom is. Így már ezt el tudom tenni, hogy oké, van egy működőképes változatom (erre a kérdéskörre), így nézhetem a pagination-t, és ha azzal nem menne (valamiért), akkor erre vissza tudok állni.
Milliószor akartam írni, segítséget kérni (ebben a prepare-es elakadásban is), de örülök, hogy végül nem tettem, és magamtól találtam rá a megoldásra, így sokkal jobb tapasztalat.
Köszönöm az iránymutatásotokat!
-
Taci
addikt
válasz
pelyib #20318 üzenetére
Igen, néztem, de sajnos nem járható út. Kb. úgy képzeld el az oldalt, mint a Facebook-feed-et, egymás alatt "ömlesztve" a tartalom (nyilván szűrve és rendezve). Ezt sajnos nem tudom oldalakba szedni.
@sztanozs:
Köszönöm, már nézem is. Most hirtelen legjobb leírásnak példákkal ezt az oldalt találtam:
https://www.sqltutorial.org/sql-limit/
Ha elakadnék, és nem bánjátok, még kérdeznék.Köszönöm!
Illetve máris kérdeznék:
"csak kell egy prepare persze még bele"
Ez a rész pontosan mi és mire kell? Ez lenne az?
https://www.w3schools.com/php/php_mysql_prepared_statements.asp -
Taci
addikt
Sziasztok!
Adott egy adatbázis, aminek a tartalmát eredetileg csak 1 db JS-függvénnyel elérve írattam ki (PHP használatával).
Ott bőven elég volt awhile($row = $result->fetch_assoc())
, mert ugye egyesével kiszedett minden sort belőle addig, amíg el nem fogyott. Tökéletesen megfelelt a célnak.Viszont kénytelen voltam módosítani úgy, hogy az első (eredeti) JS-függvény már csak az első pár sort írja ki (jelenleg 4-et), aztán a második (új) JS-függvény feladata pedig az lenne, hogy ahol az első függvény abbahagyta (a példánál maradva ugye az 5. jönne), onnan folytassa a kiírást (szintén 4-esével).
(Infinity scroll-t akarok használni, és ahhoz az kell, hogy előbb legyen annyi elem a képernyőn, hogy lehessen scrollozni (túlnyuljon a kijelzőn - erre állítottam be 4-et, mert az bőven kitölti majdnem 2szer is), aztán jön a 2. szkript, ami pedig a scrollozás mértékében fűzi hozzá a további tartalmat.)Így kétszer is megvan hívva ugyanaz a PHP fájl/kód, ezért jelenleg természetesen előröl kezdi a számozást, tehát a 0. elemtől, kiírja az első 4-et az első függvény miatt, aztán jön az infinity scrollozós szkript, és az is az első 4 elemet írja ki. Aztán scrollozok tovább, és újra az első 4-et.
Nem tudom, hogyan lehetne megoldani, hogy ahol az 1. függvény abbahagyta, onnan folytass a 2. Semmi tapasztalatom nincs ebben.
Keresgéltem, amit találtam, és talán ezt megoldaná az a PHP Session, viszont még a példakódban a példaoldalon sem működik (pedig egy nagyon jó és megbízható oldal, de ez már korábban sem működött nálam), így nem is implementáltam.
Gondoltam rá, hogy esetleg cookie-t kellene használni, de egyrészt sosem használtam még (ez nem gond, megtanulom), másrészt biztosan van egy egyszerűbb megoldás is erre.Remélem, nem túl bonyolultam írtam le, és főleg azt, hogy tudtok segíteni.
Biztos nagyon egyszerű a dolog, csak én nem látom már azt sem, ami a szemem előtt van.Köszönöm!
Még talán az
Include
-ra nézek rá. -
Taci
addikt
válasz
pelyib #20296 üzenetére
Szia!
Köszönöm a választ!
Egyelőre az időzóna beállítása a leggyorsabb megoldás, amit a kódban írtál is, és szépen működik is (ahogy a példádban is):
date_default_timezone_set('Europe/Budapest');
Tesztelem, ha esetleg valami nem jól működne vele, akkor már megírtam a kód módosítását a
DateTimeImmutable
használatával is.Köszönöm!
-
Taci
addikt
Sziasztok!
Remélem, tudtok ebben segíteni:
Adott egy időbélyegző, pl.:
$date = "Fri, 22 Jan 2021 17:36:10 +0100";
Hiába a 17:36 a pontos idő, az időzóna (+0100) miatt valamiért "elszámolja" magát, és 1 órával kevesebbet ír ki, pl.:
echo date('H:i', strtotime($date));
azt írja ki, hogy 16:36.Wordpress alatti Phpmyadmin amúgy, de Wordpress-ben is jó időzóna van beállítva (UTC+1), illetve Phpmyadmin is a pontos időt adja vissza a
SELECT NOW()
lekérdezésre.Oké, nyilván tudnám korrigálni úgy, hogy hozzáadok egy órát, de tudni szeretném vajon hol és miért megy félre a dolog, miért vonja le azt az 1 órát.
A forrás adott, tehát nem megoldás, hogy kiveszem belőle a " +0100" részt.
Köszi előre is.
Új hozzászólás Aktív témák
- Apple iPhone 16 Pro - rutinvizsga
- Óvodások homokozója
- QNAP hálózati adattárolók (NAS)
- Világ Ninjái és Kódfejtői, egyesüljetek!
- AMD Navi Radeon™ RX 9xxx sorozat
- Megjelent a Sony Xperia 10 VII
- Autós topik
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- sellerbuyer: Milyen laptopot vegyek? Segítek: semmilyet!
- Telekom mobilszolgáltatások
- További aktív témák...
- Gamer PC - R5 5500, RTX 2060 és 16gb RAM + GARANCIA
- 2025-Ös 10 Magos Legújabb Intel Core Ultra 5 225F 10x4.9Ghz RTX 5060TI 16/32Gb DDR5 5600Mhz 1TB M.2
- Ubiquiti UCG-Max-NS Cloud Gateway Max Unifi
- Apple iPhone 13 Mini 128GB, Kártyafüggetlen, 1 Év Garanciával
- Apple iPhone 13 Mini 128GB, Kártyafüggetlen, 1 Év Garanciával
- BESZÁMÍTÁS! ASUS TUF VG27AQ 165Hz QHD IPS 1ms monitor garanciával hibátlan működéssel
- BESZÁMÍTÁS! Nintendo Switch OLED 64GB fehér játékkonzol garanciával hibátlan működéssel
- LG 27MR400 - 27" IPS LED - 1920x1080 FHD - 100hz 5ms - AMD FreeSync - Villódzásmentes
- Készpénzes / Utalásos Videokártya és Hardver felvásárlás! Személyesen vagy Postával!
- BESZÁMÍTÁS! Apple Macbook Pro 13 2020 M1 16GB 1TB SSD macbook garanciával hibátlan működéssel
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest