Autor Zpráva
Dano_V
Profil
Prajem Vám všetkým dobrý deň. Chcem sa iba spýtať, či existuje nejaký spôsob na kontrolu diakritiky v PHP. Mám totiž takú kontrolu v javaskripte na formulári, ale nejaká hnusoba po anglicky hovoriaca a píšuca si vypne javasktipt, a skoro každý deň mi posiela nezmysli a nedokážem ho zablokovať inak, (aspoň si to tak myslím) iba kontrolou diakritiky, lebo to oni nevedia napísať.
Keeehi
Profil
Dano_V:
A je nějaký problém to co máš v JavaScriptu přepsat do PHP?
Dano_V
Profil
Keeehi:
Tak, neviem, akým smerom sa dať. V odosielacom PHP súbore mám kontrolu, keby niektorý input nebol vyplnený, aby taký mail mi neposlal. To by som potreboval nejaké usmernenie, či by sa tam dalo niečo dat podobné, ako to, čo funguje v javaskripte, ale by sa to nedalo používateľom vypnúť, aby mi takú poštu neposlal, v ktorej nie sú diakritiky!
V javaskripte mám toto:
{
    var _char = ['á','č','ď','é','ě','í','ň','ó','ř','š','ű','ő','ť','ú','ů','ý','ž'];
      if (this.length > 25) {
        for (var i = 0; i < _char.length; i++) {
          if (((this).toLowerCase()).indexOf(_char[i]) != '-1') return 1
        }
      } else {
        return 1 
      }
    return 0;
  }
  function _check_diacritical(arg) {
      return ((arg).check_diacritical()) ? true : false;
  }
Toto mi funguje vynikajúco, ale keď vypne javascript, tak je to nefukčné.
N71
Profil *
Měl by stačit jednoduchý regulární výraz, něco jako:
if (preg_match('/[áčďéěíňóřšűőťúůýž]+/iu', $string)) {
    // obsahuje diakritiku
}

Ale tvůj problém je jinde. Ta hnusoba, co ti píše, není člověk ale robot. Měl bys hledat spíš nějakou Captchu pro ochranu formuláře.
Radek9
Profil
Dano_V:
Tento typ kontroly naozaj nie je fajn. Ako by sa na to pozeral niekto, kto by ti tam poslal vetu bez diakritiky, ale pritom bez jedinej chyby?
Dano_V
Profil
Radek9:
Pochopil som aj vzorový odkaz bez diakritiky!

Všetkým Vám ďakujem
Dano_V
Profil
N71:
if (preg_match('/[áčďéěíňóřšűőťúůýž]+/iu', $string)) {
    // obsahuje diakritiku
}

Skúsil som to aj tak, aj s eregi, ale mi to nefunguje. Potom som rozmýšľal, že používam aj starší typ PHPmailera na odosielanie listov. Funguje to síce dobre, ale už má nedostatky, tak som stiahol najnovšiu verziu 6.4.1, čo dodávajú aj s SMTP serverom. Špekuloval som nad tým niekoľko hodín, ale ma to v žiadnom prípade nechce poslúchať.

Nechápem napríklad to, že keď má vlastný SMTP server, načo je tam takýto riadok, že:
$mail->Host = 'smtp.example.com';

V druhej ukážke je tam dosadený smtp.gmail.com. Keď má vlastný smtp server, načo používať smtp z gmailu, alebo z iného serveru? A vôbec, pripomína mi nastavenie Outlook Expresu, lebo pýta prihlasovacie meno, heslo! Na aký systém, to vôbec funguje? Ten návod som niekoľko krát preštudoval, ale nezostal som z toho múdrejší.
Pozná niekto ten systém, alebo mám sem nakopírovať celý index.php?
lionel messi
Profil
Dano_V:
Skúsil som to aj tak, aj s eregi, ale mi to nefunguje.

eregi je zo starej verzie PHP, už tuším v 5.3 bola označená za zastaralú a v PHP 7 alebo 8 odstránená.

Pri preg_match robíš niečo zle, bežne to funguje. Všimni si, že v tom regulári nemáš detekciu pre niektoré slovenské znaky, napríklad ŕ alebo ĺ či ľ, napríklad vo vetách „Idem k tete Ľubici do domu pod starou vŕbou.“ alebo „Idem na koncert Richarda Müllera.“ ti diakritiku nenájde.

Riešením je doplniť dané znaky medzi hranaté zátvorky.

Nechápem napríklad to, že keď má vlastný SMTP server, načo je tam takýto riadok, že:
$mail->Host = 'smtp.example.com';

smtp.example.com treba nahradiť adresou svojho smtp servera, example.com je čisto ukážková doména…

Trochu sa tu pomiešali dva (možno tri) problémy:

1) Problém s detekciou diakritiky.
2) Problém s rozbehaním PHP Mailera.
3) Problém, či by namiesto detekcie diakritiky nebolo lepšie použiť recaptchu.

Pokiaľ ide o bod 3), je môj názor rovnaký ako v [#4].
Dano_V
Profil
lionel messi:
Možno, že som sa zle vyjadril, diakritiku, keďže sa mi zdá trošku zložitejšia, by som na nejaký čas chcel odstaviť na bok. Neskoršie sa k tomu vrátim.

Ten preg_match som skúsil skombinovať s send() v prípade PHP maileru, aj s mail() bez maileru, či mi obmedzí odosielanie pošty, keď tá podmienka je false, ale to nemalo žiadný efekt. Tá capcha, trošku som sa o to zaujímal, na internete píšu, že na stránke, kde je nižšia návštevnosť, sa neoplatí. A tá moja stránka je taká. Denne ju navštívi nejakých sedem až osem ľudí. Takže ako prvá úloha by mala byť to rozbehnutie PHP mailera. To som ja pochopil, že smtp.example.com treba nahradiť platnou adresou, iba to som nepochopil, že prečo? A keď je to opodstatnené, tak akú úlohu potom hrá ten súbor, ktorý k tomu dodávajú? Aký to má zmysel?

A keď sa presvedčím o tom, že to celé je zbytočné, tak to celé môžem vynechať, aby mi to nejak vôbec fungovalo. Aj stará verzia fungovala bez toho.
lionel messi
Profil
Dano_V:

Ten preg_match som skúsil skombinovať s send() v prípade PHP maileru, aj s mail() bez maileru, či mi obmedzí odosielanie pošty, keď tá podmienka je false, ale to nemalo žiadný efekt.

Znovu zopakujem - niečo robíš zle. Nevidíme ukážku, ako si to obmedzoval, ale v praxi by malo fungovať toto:

//samozrejme, je to úryvok

$mailText = "Ja som smutna sprava, ktora sa nikdy neodosle";
$mail->Body = $mailText; //$mail je, samozrejme, PHP Mailer objekt

if (!preg_match('/[áčďéěíňóřšűőťúůýž]+/iu', $string)) { //zoznam diakritických znakov nie je kompletný, pre účely príkladu neriešim
  echo "Správa neobsahuje diakritiku!"; //nie je vhodné ako spôsob chyby, v praxi napr. vyhodíme výnimku
} else {
    $mail->send(); //tu bude v praxi kontrola - či sa odoslanie podarilo, alebo vyhodilo chybu
}
Dano_V
Profil
lionel messi:
Tak konečne sa mi podarilo zistiť, kde je problém: Keď som to napísal tak, ako je ukážka, tak to ide dobre. Keď som ale napísal takto:
$text = $_POST['sprava'];

if (preg_match('/[áčďéěíňóřšűőťúůýž]+/iu', $text)) {
echo "text s mäkčeňom";} 
else {
    echo "Text je bez čiar a mäkčeňov";
}
Tak stále píše, že je to bez čiar a mäkčeňov. Nezávisle na tom, aké písmená som tam napísal. A funguje to aj vtedy tak, keď to zaradím do podmienok odosielania. Keď ale namiesto $_POST['sprava'] napíšem "á", tak napíše správne, aj mi odošle list, a keď tam napíšem "a", tak mi list neodošle.
$string = "á";
if (preg_match('/[áčďéěíňóřšűőťúůýž]+/iu', $string)) {
 
if  ($email && $meno && $text)
 { mail()... 
Teda problém je v tom, že to nedokáže prečítať obsah inputu z formulára.
lionel messi
Profil
Dano_V:

Ako zhruba vyzerá základné ladenie v PHP (ak nemám debugger):

1) Snažím sa identifikovať kus kódu, kde je problém (to sa ti podarilo).
2) Tesne nad daný kus kódu doplním var_dump problematickej premennej. Čiže v tvojom prípade:

var_dump($_POST["sprava"]);exit;
$text = $_POST['sprava'];

Kód za exit sa nevykoná.

3) Posúvam sa v kóde vyššie, do inej funkcie, súboru a pod., kým nedokážem problém odstrániť.

Čo ti ten var_dump vypíše? Tipujem null. Skontroluj, či je atribút name daného inputu skutočne sprava a nie niečo iné (preklep, pozostatok kopírovania...). Ďalej skontroluj, či skriptu predkladáš toto pole naozaj vyplnené. Skontroluj aj to, či má formulár nastevené method="post", predvolene sa posiela get.
N71
Profil *
Dano_V:
Izoluj jednotlivé problémy a řeš je postupně, jak ti radí lionel messi. S tímto gulášem ti těžko někdo bude radit.

Co se týče PHPMaileru (nebo jiných mailových knihoven), zvládá většinou připojení k externímu SMTP (například Gmail) a nebo běžněji odesílání pomocí funkce mail(). V takovém případě řeší připojení k SMTP samotný server ve kterém běží PHP.
Dano_V
Profil
lionel messi:

Dobre, to vyskúšam, ale to dnes už nie. Skúsil som ale niečo iné: Skúsil som to zaniesť aj do starého PHP mailera takýmto spôsobom:
if (preg_match('/[áčďéěíňóřšűőüöťúůýž]+/iu', $_POST['sprava'])) {
if ($_POST['meno'] && $_POST['email'] && $_POST['sprava']){

$mail->Send();
echo "Váš <b>odkaz bol</b> úspešne <b>odoslaný</b>! Môžete sa vrátiť k <a href='javascript:history.go(-1)'>formuláru.</a> ";
}}

else {...
A toto funguje vynikajúco
Dano_V
Profil
lionel messi:

Tak skúsil som to

var_dump($_POST["sprava"]);exit;
$text = $_POST['sprava'];
a pomohlo mi to odhaliť chybu. Kódovanie html stránky som mal vo windows-1250 a PHP stránku utf-8. Ten kód mi síce načítal obsah inputu z formulára, ale diakritiky dostali neskutočný tvar, preto mi to nechcelo fungovať. Tak som to prekódoval na utf-8 a budem používať PHP mailer, s tým to funguje dobre.

Ale s tým je taký problém (je to starý mailer), že keď odošle list do mojej schránky, čo mám od providera, tak sa mi to tam neobjaví. Jednoducho sa stratí. Iba keď to pošlem do schránky na gmail.com, tak to príde! Preto by som potreboval spojazdniť ten nový mailer, s tým sa budem zabávať.

N71:
Co se týče PHPMaileru (nebo jiných mailových knihoven), zvládá většinou připojení k externímu SMTP (například Gmail) a nebo běžněji odesílání pomocí funkce mail(). V takovém případě řeší připojení k SMTP samotný server ve kterém běží PHP.

To znamená, že v každom prípade sa listy odosielajú s pomocou SMTP serveru? Ja som si myslel, že to odosiela priamo PHP skript! Tak som o niečo zase múdrejší.-))

Ďakujem vám všetkým ešte raz za pomoc, bola skutočne cenná, dúfam, že sa mi podarí rozbehnúť aj ten nový mailer.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0