1

(4 replies, posted in PHP)

http://www.mysql.lt/wiki/Lietuviskos_raides

Iš dalies turetų padėt, kaip, kas, kur, kada, ir svarbiausia: Kodėl? :)
Sėkmės!

2

(3 replies, posted in PHP)

Aš jau įsivaizduoju, kaip turėtų atrodyti šie trys tikrinimai, ir antru pavyzdžiu aš bandau įgyvendint tik unikalių įrašų įterpimą (jei toks įrašas yra duomenų bazėj, jo neįterpiam), bet problema yra pačiu įrašų tikrinimas, kurie yra CSV faile...

Kažkaip reikia man išsiimti po vieną įrašą csv faile ir jį sutirkinti su duomenų baze, prieš įterpiant.

Kitaip apžvelgsiu problemą :):
turiu 30 studentų csv failą. Per šį skirtuką sumetu juos į db, viskas ok.. Showing rows 0 - 29 (30 total).
ištrinu iš db kas antrą įrašą, kaip pvz, tada lieka Showing rows 0-14, (15 total).
tada vėl tą patį csv failą paduodu su tais pačiais 30 studentų, ir rezulatas gaunasi - 0-44 (45 total) (kur 15 įrašų yra duplikuoti)
nors rezultate noriu gauti tuos pačius 30 unikalių įrašų.

3

(3 replies, posted in PHP)

Susidūriau su problema, gal galite padėti ją išspręsti,
taigi idėja tokia: per formytę uploadinam studentų sąrašą (csv pavidalu), ir visą tą sąrašą insertinam į duomenų bazę.
Jei csv failas turi stuleplių pavadinimus, tai pirmą eilutę praskipinam.
Tačiau, prieš įterpdami turim patikrinti, ar tokio studento nėra duomenų bazėj. Kaip tą įgivendinti?
Bendrai paemus man reik patirkinti tris požymius:
jeigu login ir asm_id yra vienodi - neįterpiam išvis;
jeigu login ir asm_id yra skirtingi - update'inam tą įraša pagal asm_id;
jeigu login ir asm_id išvis tokia pora neegzistuoja (unikalus įrašas) - tokį įterpiam.

čia yra pirminis sprendimas, be jokių tirkinimų.

while (($data = fgetcsv($handle, 1000, "$skirtukas")) !== FALSE){
 if($pirma_eilute){$pirma_eilute=false;continue;} //skip'inam pirma eilute, jeigu yra headeris.
  $import="INSERT INTO testas (login,pwd,user_category_id,asm_id) VALUES ('$data[0]','$data[1]','$data[2]','$data[3]')";
  mysql_query($import);
 }
}

čia bandžiau kažką kniurpti, tačiau toks sprendimas man visiškai nepagelbėjo:

while (($data = fgetcsv($handle, 1000, "$skirtukas")) !== FALSE){
 if($pirma_eilute){$pirma_eilute=false;continue;} //skip'inam pirma eilute, jeigu yra headeris.
 $tikrinam = "SELECT asm_id, login FROM testas WHERE asm_id = '$data[3]' and login = '$data[0]'";
 $import="INSERT INTO testas (login,pwd,user_category_id,asm_id) VALUES ('$data[0]','$data[1]','$data[2]','$data[3]')";
 $tikrinam2 = mysql_num_rows($tikrinam);
 if($tikrinam2==0){
  mysql_query($import);
 }
}

Kaip aš suprantu, čia maniškis kodas patikrina įrašą, jį radęs, nevygdo užklausos, tačiau jeigu jis neranda, įvygdo import užklausą, kur įterpia visą failo turinį, nebepatikrinęs likusių.

Niekaip nesugalvoju, kaip kad tikrintų kiekvieną įrašą esantį tam csv faile su duomenų bazėj esančiu įrašu.
Ačiū

Aukso vertės turinys:
http://www.mysql.lt/wiki/Lietuviskos_raides

Sėkmės!

5

(8 replies, posted in PHP)

<?php
include 'piece/connection_real.php'; 
mysql_query("SET NAMES 'utf8'");
$dalykas = $_GET['dalykas'];
$id = $_GET['id'];
$grupe = $_GET['grupe'];
$pavadinimas = $_GET['pavadinimas'];
$sql = "SELECT id, vardas FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '$id' ORDER BY studentai.vardas ASC";
$uzklausa = mysql_query($sql, $con);

echo "<thead>";
    echo "<tr>";
        echo "<th></th>";
        echo "<th>Vardas</th>";                
    echo "</tr>";
echo "</thead>";

    while($eilute = mysql_fetch_array($uzklausa)){
        echo "<tr>";
            echo "<td><input type='checkbox' name='data[]' value='".$eilute['id']."'/></td>";
            echo "<td>".$eilute['vardas']."</td>";
        echo "</tr>";
    }

?>

Taip, html neatskirtas nuo php, bet dabar ne čia esmė.
čia phpmyadmino rezultatas:
http://img641.imageshack.us/img641/3093/sqln.png

Kas dar yra įdomu, kitur taip pat naudoju toki pati connection'ą: include "piece/connection_real.php";
viskas kitur suveikia...

Nustotų varyti į neviltį, manau, jei select'e nurodytum tikslų kelią iki stulpelio (studentai.id, studentai.vardas).

Sakyčiau yra vienodai tikslu, kai sql'as rezultate turi didžiulę lentelę su skirtingais stuleplių pavadinimais.
Jeigu jam nebūtų tikslu, tai rašytų: Column 'xxx' in where clause is ambiguous. Kažkas tokio :)

6

(8 replies, posted in PHP)

$sql = "SELECT id, vardas FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '$id' ORDER BY studentai.vardas ASC";
echo $sql;

SELECT id, vardas FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '29' ORDER BY studentai.vardas ASC

7

(8 replies, posted in PHP)

Nesu jau toks žalias, kad nesusidoročiau su mysql ir php duomenų išvedimu į ekraną, tačiau šis atvėjis varo į neviltį :)
Turiu užklausėlę:

SELECT id, vardas FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '$id' ORDER BY studentai.vardas ASC

id įgauna reikšmę 29; tačiau duomenų neišveda.

Suvedus užklausa į phpmyadminą (su id 29), rezultatas:

Showing rows 0 - 8 (9 total, Query took 0.0012 sec) [vardas: Eva - Violeta]

su echo nieko nepešęs pradėjau var_dumpint:

$sql = "SELECT id, vardas FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '$id' ORDER BY studentai.vardas ASC";
var_dump($sql);

Rezultatas:
string(235) "SELECT id, vardas, pavarde, login, vidinis_pass, email, auth FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '29' ORDER BY studentai.vardas ASC"

$sql = "SELECT id, vardas FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '29' ORDER BY studentai.vardas ASC";
var_dump($sql);

Rezultatas:
string(211) "SELECT id, vardas, pavarde, login, vidinis_pass, email, auth FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '29' ORDER BY studentai.vardas ASC"

Iš čia kyla pirmasis klaustukas, kodėl užklausos vienodos, bet stringo ilgis skirtingas, net 14 simbolių?

Toliau;

$uzklausa = mysql_query($sql, $con);
var_dump($uzklausa);

Rezultatas: NULL

var_dump($con);

Rezultas: resource(3) of type (mysql link)

Na ir dar pabandžiau tokį varianta:
vietoj '$uzklausa = mysql_query($sql, $con);' naudoju:
$julius = mysql_query("SELECT id, vardas FROM studentai, studentu_sarasai WHERE studentai.id = studentu_sarasai.studento_id AND studentu_sarasai.saraso_id = '$id' ORDER BY studentai.vardas ASC", $con);

var_dump($julius);

Rezultatas: bool(false)

Apibendrintai noriu pasakyti, kad užlausa atrodo gerai, jei rodo phpmyadminas, išvesdamas duomenis, tačiau,
while($eilute = mysql_fetch_array($uzklausa)){ ... } niekas nebeveikia, nebeišveda duomenų. Gal kur ką pražioplinęs būsiu, bet klaidų kaip ir nematau.

minde wrote:
JuliusGr wrote:

Siaip pats pakuriai koki tai webuka su inputu, be jokiu apsaugu, ir iterpinejant

';-- Drop table users;

ar panasiai, nesuveikia )

Duok webuko adresą, patikrinsim. Tai ką tu tikrini yra daug šansų ir priežaščių, kodėl neveikia:
a) dažniausiai nepalaikoma multi-query;
b) kartais nera drop teisių;
c) ...

čia ant localhosto. Kiek girdėjau nuogirdų, tai atseit net neina iš localhosto indžektint. Bet nesigilinau į šitas nuogirdas.
Anyway, gal nesuveikia ir dėl to, kad sql užklausai jau paduodu '$kintamaji', o ne '$_POST['laukelis']'..?
O kas liečia pačią db, tai prisijunginėju kaip root'eris, ir jam viskas leidžiama. :)

Siaip pats pakuriai koki tai webuka su inputu, be jokiu apsaugu, ir iterpinejant

';-- Drop table users;

ar panasiai, nesuveikia )

10

(24 replies, posted in PHP)

Hey! Suradau sprendimą! :)
Tiesa, neveikė ir mb_substr.

Sprendimas, kuris pagelbės ir Doncei:

$stringasLT = "ąžuolas";
$substringasLT = substr($stringasLT,0,1)
echo $substringasLT;

Kaip žinia, išves kringelį: "&#65533;"

Tačiau parašius:

$substringasLT = substr($stringasLT,0,2);

Išves, ką ir turi: "ą"

Taip pat išves visas lietuviškas raides, jei stringas ilgesnis yra, tiesiog reik substr flagą '$length'* vienu vienetu didesniu parašyti.

PHP wrote:

*string substr ( string $string , int $start [, int $length ] )

Spėju, kad dėl lietuviškos raidės jis ją paima kaip už du slotus, bet kaip ir kodėl neišrišu. :)
Gero naudojimo!

11

(24 replies, posted in PHP)

Iš preg_replace išsiaiškinau, kad cia substr bėdą daro: substr('šaka',0,1). Taip išeina, kad preg_replace susitvarko su lietuviškom raidėm, bet atejas iki substr, substr'ingas ją pameta... substr('šaka',0,1) => &#65533;.

Koks galėtų būdas buti, kad tiesiog, kad vietoj to kringelio aš tiesiog įterpinėčiau š raidę?
Galvoju, gal eitų kaipnors raidės koda repleisint, jeigu ateina toks kringelis... :)

12

(24 replies, posted in PHP)

Min2liz wrote:

Nusistatyk headeri meta utf-8 ir pasikeisk failo koduote is ANSII i UTF-8 kaip qutwala sake. Jei tai nepades tuomet busi antrasis Koperfieldas.

Matyt būsiu pastarasis, nes:

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ...

net nupaišiau skryną:
http://img96.imageshack.us/img96/340/utf8.png
Dar norėčiau pastebėti, kad 'kringėlis' atsiranda tik dirbant su preg_replace ir substr'ingu. Iš duomenų bazės paimant, viskas atrodo gražiai,
naudoju pačioj db 'utf8_general_ci', atvaizduoti naudoju jau minėtus <meta>, visi failai pas mane koduojami be BOM'o ir utf8, ir 'mysql_query("SET NAMES 'utf8'");'

13

(24 replies, posted in PHP)

Tai tikiu, kur meleonas kodo ir kur viena eilutė. šiaip susidūriau su eiline problema, enkodingu:

$secondpart = preg_replace("/(.*?).\((.*?)\)/e", "'('.substr('$2',0,1).')'", $specialybe);
echo strtoupper($secondpart);

ir jeigu ateina stringas (šaka) tai ją paverčia į: (&#65533;), nors turėtų būti (š)
ką jau išbandžiau, tai
mb_substr - false, tada intike radau tokį sprendimą:

  $string="texto en espa&#241;ol";
  echo utf8_encode(substr(utf8_decode($string),0,14)); //Outputs: texto en espa&#241;

pritaikius jį, vietoj 'š' iįveda '?', vistiek false.

Ir dar šiaip toks klausimas stojasi, kodėl toks problematiškas php'o elgesys su enkodingu? Begale funkcijų matau, kad tvarkytis su utf-8, ir vistiek bendro sprendimo nepadaryta, o ir vieningo sprendimo neina pritaikyti. Vis kažkam kažkas ne taip suveikia :). Negilios programvimo žinios, man veda išvadą, kad implementintu į php kokį 'native' utf8 supportą ir atrodo išspręstų visas problemas... :)

14

(24 replies, posted in PHP)

Aišku, jeigu palygintumem kodus, kur viena eilute, ir kur visas griozdas - skirtumas yra, tačiau:

$specialybe = str_replace(" ir ", " ", $subcat5);                                            //is 'specialybes' ismetam ' " ir " '
$pattern = '/\(/';                                                                           //ieskom pagal paterna pirmo skliausto
$check = preg_match($pattern, $specialybe);                                                  //tikrinam, ar yra tokia specialybe
    if($check){                                                                              //jeigu yra:
        $part = preg_replace("/([\(](.*?)[\)])(.*)/e","",$specialybe);                       //nuimu visame stringe visus skliaustus
        $explode = explode(" ",$part);
        foreach($explode as $item){
        echo $firstpart = substr($item,0,1);                                                 // ir sudelioju zodzius po viena raide
    }
    $secondpart = preg_replace("/(.*?).\((.*?)\s(.*?)\).\((.*?)\)(.*)/e",                    //pirmus skliaustus pasiemu \((.*?)\s(.*?)\) 
        "'('.substr('$2',0,2).''.substr('$3',0,2).')('.substr('$4',0,1).')'", $specialybe);  //ir kitus skliaustus \((.*?)\)
    echo $secondpart;                                                                        //sukarpau ir sudelioju kaip noriu
    }else{                                                                                   //jeigu nera:
        $firstpart = preg_replace("/([\(](.*?)[\)])(.*)/e","",$specialybe);
        $explode = explode(" ",$firstpart);
            foreach($explode as $item){
                echo $item = substr($item,0,1);
            }
    }

surašiau komentarus, ką ir kaip kas daro, jei kam būtų neaišku. žinau, atrodo negražiai, bjaurus kodas ir pan. Tą suprantu :)
Tik pastebėjau tokį daiktą, kur kodas nesuveikia:

informatika bla bla -> ibb [suveikia]
informatika bla bla (bla bla) (bla bla) -> ibb(blbl)(bb) [suveikia]
informatika bla bla (bla bla) -> ibb (blbl) [nesuveikia]

reikia šitą eilutę paeditinti, kad tikrintų tik pirmus skliaustus.

$secondpart = preg_replace("/(.*?).\((.*?)\s(.*?)\).\((.*?)\)(.*)/e", "'('.substr('$2',0,2).''.substr('$3',0,2).')('.substr('$4',0,1).')'", $specialybe);

15

(24 replies, posted in PHP)

Ačiū! Bet, visdelto savo kodą pritaikiau labiau, tik pusė naudos, jei kodas veikia, o jo nifiga nesupranti. Savo rašytas kodas ir lieka savo rašytu kodu. :)
Išvis regular expressionas žiauriai rimtas ir galingas daiktas, bet pusžaliems hatskeriams (kaip aš) dar sunku perkąst.

16

(24 replies, posted in PHP)

Tikslu to nepavadinčiau, bet tikėjausi gatavo sprendimo :)
Jeigu būtum pajuodinęs žodį 'nemokamai', būtų natūralus klausimas "už kiek?" :D

By the way,
Ačiū už nuorodas! (Y)

17

(24 replies, posted in PHP)

Blyn, tikėjausi gatavo sprendimo :( :D

18

(24 replies, posted in PHP)

Sveiki. Susidūriau su žudančia problema:
turiu stringa, kuris formuojamas taip:

[a-zA-Z] ( [a-zA-Z] )
pvz: Adresas (Miestas)

arba

[a-zA-Z] ( [a-zA-Z] )  ( [a-zA-Z] )
pvz: Adresas (Miestas) (Rajonas)

o uzduotis gauti sutrumpinta stringa:
A (M) arba A (M) (R)

Kaip sita dalykeli įgivendint?

Mano bandytas atvejis netinka, kai ateina stringas su skliausteliais:

$test3 = str_replace(" ir ", " ", $subcat5); // išmetu žodelį 'ir'
$test4 = explode(' ',$test3); //sumemtau į masyvą žodžius atskirdamas tarpu
foreach($test4 as $v){$test5.=substr($v,0,1);} // suklijuoju gautus simbolius
$spec_trump = strtoupper($test5);

Tai su tokiu kodu gaunu rezultatą:
jei yra Architektu (Vilnius) tada A(
arba
jei yra Architektu (Vilnius) (Lazdynai) tada A((
arba
jei yra Architektu (Miestas Vilnius) (Rajonas: Lazdynai) tada A (V(L

O atitinkamai rezultato reiktų: A (V); A (V) (L); A (M V) (R L)

čia gal net ne preg_matchą reiktų naudot, nebežinau

Sveiki. Ačiū žostkai už pagalba :) Viskas išėjo, kaip norėjau. Netgi dar geriau smegenyse susigulėjo kaip tas php'as su html'u dirba :).

Viena problema buvo iškilusi, kad į csv failą sumetus list'ą su lietuviškom raidėm, jį excelis atvaizduoja 'kringeliais'. Tai nutariau, kad tai pačio excelio klaida. Nes patikėkit, viską išbandžiau. utf8_encode (jokios naudos, nes gaunasi tas pats kas is utf8 encodinu į utf8), iconv ir dar kitas komandas, kurių nepamenu :).

Nusprendžiau, kad excelio klaida, nes pvz tą patį csv failą atidarius su notepad++/geany ji rodo gražiai, tačiau atidarant su exceliu, jį išdarko.

Galvojau problemos dar yra su BOM'u, tačiau jokio skirtumo nebuvo :)

Nu žiek, turiu dabar kaip ir dvi formas,
vienoje, checkbox'ai:

echo "<td><input type='checkbox' name='data[]' value='"\".$eilute['VARDAS']."\";\"".$eilute['PAVARDE']."\";\"".$eilute['AMZIUS']."'/></td>";

kuriami tam, kad būtų rašomi į csv failą "";"";""; tokiu formatu, atitinkamai excelis tai sudeda į langelius

kitoje:

echo "<td><input type='checkbox' name='data[]' value='\"".$eilute['id']."\"'/></td>";

o taip kuriami tam, kad būtų studentai susieti duomenų bazėje su sąrašu.

šias dvi formas noriu padaryti į veiną. Su dviem mygtukais. Vienas mygtukas i csv failą rašo vardą, pavardę ir amžių, kitu mygtuku aš į duomenų bazę talpinų sutdentų id (priskiriu sąrašui).
Kaip reiketų apsirašyti patį checkbox'ą?

Nesugalvoju jokio sprendimo, nes galvoju taip: jeigu i value paduosiu id, vardą, pavardę ir amžių, tai priskirdamas į sąrašą, tai stulpas1 nebebus vien tik ID (bus ir vardas, ir pavardė, ir amžius įrašytas)
Alternatyviai, jeigu į value paduosiu tas pačias reikšmes, tai į csv failą įrašynės ne tik vardą, pavardę bet ir ID, ir be jokių kabučių ar kabliataškių...

It is so complicated... :)