Theory
Server ફરી ચાલુ થાય એટલે data ગાયબ
Event portal ની registration ની list PHP ના array માં રહે છે, એટલે request પૂરો થાય એ ક્ષણે એ ગાયબ થઈ જાય છે: દરેક page load કોરી પાટીથી શરૂ થાય છે. ખરાં portals યાદ રાખે છે. Data ને ટકાવવાની સૌથી સાદી રીત એટલે એને server પરની FILE માં લખવો.
વળી registration માટે ઘણી વાર upload પણ જોઈએ: વિદ્યાર્થીનું ID card કે ફોટો. PHP બંને સંભાળે છે: files વાંચવી-લખવી, અને uploads મેળવવાં. આ પાઠ portal ને ટકાઉ સંગ્રહ અને file uploads આપે છે, સાથે ઘણાં pages વાળી site ને વ્યવસ્થિત રાખતાં code ફરી વાપરવાનાં ઓજારો (include, require) પણ.
Theory
include સામે require: ફરી વાપરવાની જોડી
ખરી sites વહેંચાયેલા code ને (header, database નું config) અલગ files માં મૂકે છે અને દરેક page માં ખેંચી લે છે:
- include 'header.php'; file ને અંદર ખેંચે છે; એ ન મળે તો PHP ચેતવણી આપીને આગળ ચાલે છે
- require 'config.php'; file ને અંદર ખેંચે છે; એ ન મળે તો PHP ઘાતક ભૂલ આપીને અટકી જાય છે
નિયમ: જેના વગર page ચાલી જ ન શકે એવી વસ્તુઓ માટે require વાપરો (database નું config), અને મરજિયાત વધારા માટે include (sidebar). _once વાળાં રૂપો (include_once, require_once) એક જ file ને ભૂલથી બે વાર ખેંચાતી અટકાવે છે. require અને include માંથી સાચું પસંદ કરવું એ પરીક્ષાનો સામાન્ય સવાલ છે.
Practical
Registrations ની file વાંચવી અને લખવી
<?php
require 'config.php'; // fatal if missing: the page needs it
// WRITE (append a registration line)
$f = fopen("registrations.txt", "a"); // 'a' = append
fwrite($f, "Riya, Garba Night\n");
fclose($f); // always close
// READ the whole file back
$data = file_get_contents("registrations.txt");
echo nl2br($data); // show it with line breaks
?>
Theory
File uploads, સલામત રીતે
File સ્વીકારવા માટે HTML form ને 2 વસ્તુ જોઈએ: method="POST" અને enctype="multipart/form-data". પછી upload થયેલી file $_FILES superglobal માં આવે છે:
$_FILES['idcard']['name']: મૂળ filename$_FILES['idcard']['tmp_name']: PHP એ એને જ્યાં કામચલાઉ મૂકી હોય તે જગ્યા$_FILES['idcard']['size'],['type'],['error']
File એ કામચલાઉ જગ્યાએ પડી રહે છે અને તમે એને સાચવો નહીં તો request ને છેડે ભૂંસાઈ જાય છે: move_uploaded_file($_FILES['idcard']['tmp_name'], "uploads/" . $safeName). અને આ file કોઈ અજાણી વ્યક્તિએ પસંદ કરી છે, એટલે એના પર ભરોસો કરતાં પહેલાં એનો પ્રકાર અને કદ ચકાસવાં જ પડે: તપાસ્યા વગરનું upload એ ગંભીર સલામતીનું બાકોરું છે.
Quiz
config.php માં database ની એવી settings છે જેના પર આખું portal આધાર રાખે છે. એને include થી ખેંચવી કે require થી, અને શા માટે?
- include: એ ચેતવણી આપીને આગળ ચાલે છે, જે વધુ સલામત છે
- require: અનિવાર્ય config ન મળે તો page તૂટેલી હાલતમાં ચાલવાને બદલે ઘાતક ભૂલ સાથે અટકી જવું જોઈએ
- બંનેની અસર એકસરખી જ છે
- એકેય નહીં: config દરેક file માં ચોંટાડવું જ પડે
Show the answer
require: અનિવાર્ય config ન મળે તો page તૂટેલી હાલતમાં ચાલવાને બદલે ઘાતક ભૂલ સાથે અટકી જવું જોઈએ
જેના વગર page ચાલી જ ન શકે એવી વસ્તુ માટે require વાપરો: config.php ન મળે તો require ઘાતક ભૂલ સાથે અમલ અટકાવી દે છે, અને એ જ બરાબર છે: database ની settings વગર ચાલતું portal ગૂંચવણભરી અને અસલામત રીતે નિષ્ફળ જાય, એટલે સાફ રીતે અટકી જવું વધુ સલામત છે. include ફક્ત ચેતવણી આપીને આગળ ચાલે છે, જે મરજિયાત ટુકડા (sidebar) માટે યોગ્ય છે પણ અનિવાર્ય પરાધીનતા માટે ખોટું છે. વિકલ્પ C ખોટો છે: file ન મળે ત્યારેનું વર્તન જ આખો ફરક છે. વિકલ્પ D તો ફરી વાપરવાનો હેતુ જ મારી નાખે છે. નિયમ: અનિવાર્ય વસ્તુ માટે require (ન હોય તો અટકો), મરજિયાત વધારા માટે include (ન હોય તો ચાલુ રાખો).
Think first
ગાયબ થઈ ગયેલું upload
એક વિદ્યાર્થીનું upload નું form ચાલે છે, $_FILES બતાવે છે કે file આવી ગઈ, પણ સાચવેલી file ક્યાંય નથી અને પછીના requests ને એ મળતી નથી. કયું એક પગથિયું છૂટી ગયું, અને PHP આવું વર્તન કેમ કરે છે? વિચારીને પછી tap કરો.
Show the answer
વિદ્યાર્થીએ move_uploaded_file() કદી બોલાવ્યું જ નહીં. PHP upload ને કામચલાઉ જગ્યાએ (tmp_name માં) મૂકે છે અને request ને છેડે એને આપોઆપ ભૂંસી નાખે છે; એ જ request ની અંદર તમે એને કાયમી folder માં ખસેડો નહીં તો એ ગઈ સમજો. એટલે $_FILES એ request દરમિયાન file બરાબર બતાવી, પણ એને સાચવ્યું કોઈએ નહીં. ઉપાય: request પૂરો થાય એ પહેલાં move_uploaded_file($_FILES['idcard']['tmp_name'], "uploads/$safeName") કરો. (અને સલામતી માટે પહેલાં પ્રકાર તથા કદ ચકાસો અને સલામત filename બનાવો.) પહેલાં કામચલાઉ, પછી ખસેડવું, એ રચના ઇરાદાપૂર્વકની છે: એ તમને upload ને disk પર કાયમી કરતાં પહેલાં તપાસવા અને ચકાસવા દે છે.
Watch out
File સંભાળવાના ફાંદા
move_uploaded_file ભૂલી જવું: કામચલાઉ file ગાયબ થઈ જાય છે; upload ખોવાય છે.
ચકાસ્યા વગરનાં uploads: પ્રકાર અને કદ તપાસો; વપરાશકારે આપેલા filename પર કદી ભરોસો ન કરો કે upload થયેલી file ને ચલાવો નહીં.
મરજિયાત files માટે require: મરજિયાત file ન મળે તો page મરી ન જવું જોઈએ; ત્યાં include વાપરો.
Files બંધ ન કરવી: fopen કે fwrite પછી fclose() કરો; ખુલ્લા રહી ગયેલા handles મુશ્કેલી ઊભી કરે છે.
ખોટો fopen નો mode: 'w' file ને કાપી નાખે છે (ભૂંસી નાખે છે); છેડે ઉમેરવા 'a' વાપરો: data ગુમાવવાની આ જાણીતી ભૂલ છે.
Theory
Files પતી ગઈ, હવે ઘાટબદ્ધ data
Portal હવે data ટકાવે છે અને uploads સ્વીકારે છે. પણ ઘાટબદ્ધ records માટે સાદી લખાણ files બેડોળ પડે છે; ઘાટબદ્ધ data ની આપલે માટેનો આધુનિક ઘાટ છે JSON, જેને તમે BCA405-01 માં મળી ચૂક્યા છો. પછીનો પાઠ PHP ના filters (filter_var) થી forms ને બરાબર ઘડે છે અને ચકાસે છે, અને json_encode તથા json_decode થી JSON વાંચે-લખે છે, જેથી portal JavaScript ના front-ends જેવી જ data ની ભાષા બોલી શકે.
Summary
Key takeaways
- include file ને અંદર ખેંચે છે અને એ ન મળે તો ચેતવણી આપીને આગળ ચાલે છે; require ઘાતક ભૂલ આપીને અટકી જાય છે: અનિવાર્ય વસ્તુઓ માટે require વાપરો.
- include_once અને require_once એક જ file બે વાર ખેંચાતી અટકાવે છે.
- File ની ક્રિયાઓ: fopen(mode r/w/a), fread અને fwrite, fclose; અથવા file_get_contents અને file_put_contents; 'w' કાપી નાખે છે, 'a' છેડે ઉમેરે છે.
- Uploads માટે method POST અને enctype multipart/form-data જોઈએ; file $_FILES માં આવે છે (name, tmp_name, size, error).
- Upload સાચવવા move_uploaded_file() કરવું જ પડે, નહીં તો PHP request ને છેડે કામચલાઉ file ભૂંસી નાખે છે; પ્રકાર અને કદ ચકાસો.
- Directory ની ક્રિયાઓ: opendir, readdir, closedir, scandir, mkdir, rmdir.
- યાદ રાખવાની કડી: અનિવાર્ય વસ્તુઓ માટે require, અને upload ગાયબ થાય એ પહેલાં એને ખસેડો.