S tím prstencem je problém v tom, že to není jen prstenec, ale čtverec. Takže do toho budeš muset nějak zakomponovat průhlednost. Nejednoduší je to "oříznout".
...
img = np.ma.masked_where(img < 0.2, img)
S tím prstencem je problém v tom, že to není jen prstenec, ale čtverec. Takže do toho budeš muset nějak zakomponovat průhlednost. Nejednoduší je to "oříznout".
...
img = np.ma.masked_where(img < 0.2, img)
Co myslíš sloučením obrázků?
pole[real:1:3] je nesmyl a překvapuje mně, že to vubec jde. Random vždycky vrací celé číslo a takhle z něj real neuděláš.
pole[index] := random(10000) / 1000;
Kreslil bys samozřejmě programově. Není problém udělat jednu stranu a tu pak otočit. Podle toho, co přesně chceš, já bych to viděl spíš na zobrazení předem připraveného obrázku.
Už v původní Wirthově specifikaci Pascalu je řečeno, že takhle se určuje návratová hodnota funkce.
Pascal User Manual and Report: ISO Pascal Standard
Within the function declaration there must be an executed assignment (of the result type) to the function identifier to "return n" the result of the function.
Rozhodně to není specialita Turbo Pascalu, i když asi můžou existovat varianty Pascalu, kde to takhle nejde.
K "duplikácii nazvou" nedojde, protože nedefinuješ "dve veci". Je to jen příkaz přiřazení, ne definice něčeho nového.
Já tam vidím int a Project1.exe ve stejné složce, takže v tom asi problém nebude.
To jsem se nepodíval na tu cestu. Nakonec v tom ten problém asi bude, že zdrojový a cílový int jsou ta samá složka.
Je řeč o tom tvém instalátoru.
Třetí bod je to, co nefunguje. Tak se ptám jestli tam tu zdrojovou složku máš.
První obrázek naznačuje, že možná ten instalátor máš v cílové složce, což samozřejmě nemůže fungovat. A druhý obrázek je úplně na hovno.
Já tam vidím int a Project1.exe ve stejné složce, takže v tom asi problém nebude.
Pokud trváš na tom, že exáč je v system, tak tam musí být i ta zdrojová složka int.
myZdroj := ExtractFilePath(Application.ExeName) + 'int\*.*';
A SHFileOperation v případě chyby vrací chybový kód, tak z něj by možná šlo něco vyčíst.
To je standardní způsob a měl by fungovat všude. Tak prostě Pascal funguje. Konkrétně toto ti nejde zkompilovat, protože tu funkci máš deklarovanou špatně a překladač ti v chybovém hlášení nejspíš i říká, kde přesně je problém.
Já si Windows a Delphi instalovat nebudu, abych se podíval, kam se to kompiluje :-) Byl to jen tip, který si musíš vyhodnotit sám.
Pascal v ifu vyžaduje pravdivostní hodnotu a nedělá implicitní konverze, takže z řetězcem si tady neporadí. Můžeš to napsat takhle
if meno <> '' then {meno neni prazdny retezec}
...
Ale to je pravidlo Pascalu, ne nutně obecně programování. Třeba Python vyhodnotí prázdný řetezec jako False a neprázdný jako True, takže tam by taková podmínka fungovala.
Nejsem si jistý správností použití PChar na dočasné proměnné, ale ten kdo ti poradil asi víc, co dělá. Jinak tam nic okatého nevidím.
Možná bude problém v tom, že to kopíruje ze složky int ve složce, kde je exáč. Nevím, v čem to kompiluješ, ale pravděpodobně umístění exáče bude něco jako win32\debug\program.exe a win32\release\program.exe. Takže tam musí být i ta tvoje složka int (nebo přesuň exáč).
To [100, 20] jsou souřadnice v pixelech? Tak pokud má ta šachovnice třeba velikost políčka 10 pixelů, tak jsi na políčku [100/10, 20/10] => [10, 2] (což je teda mimo šachovnici)
sloupec := (pointer_x - sachovnice_x) div sirka_policka;
radek := (pointer_y - sachovnice_y) div vyska_policka;
Ale na takovou drobnost se asi neptáš. Takže nevím.
IOUtils do uses na začátku souboru a Copy do funkce obsluhující kliknutí na Install.
Ale než psát vlastní installer, tak možná mrkni na Inno Setup, NSIS, Windows Installer a podobné programy pro vytváření instalátoru.
Je kolmá, ale zase máš "zmáčknuté" zobrazení. To sakra na těch hodnotách nevidíš?
uses System.IOUtils;
...
TFile.Copy('odkud', 'kam', true);
Není mi jasné, co tím myslíš. [0,0] je vlevo nahoře. Grafický mód (rozlišení) můžeš vybrat při inicializaci grafiky, nebo později zjistit šířku a výšku pomocí GetMaxX a GetMaxY.
Každý objekt bude tam, kam ho umístíš. Pro funkce, které kreslí na aktuální pozici kurzoru, můžeš jeho pozici zjistit pomocí GetX a GetY, nebo nastavit pomocí MoveTo.
Co konkrétně na tom potřebuješ vysvětlit?
url = image.get_attribute('src')
response = requests.head(url)
response.status_code == 200
HTTP metoda HEAD stahuje jen hlavičky. Kód 200 znamená OK. Ve výsledku to zjišťuje jestli ten obrázek existuje.
Jestli chceš střed otáčení uprostřed toho polygonu, tak nevím, jestli na to je něco chytřejšího, ale jednoduché řešení je posunout ho na [0,0] (nebo rovnou definovat tak ať je jeho střed na nule), pootočit a pak vrátit zpátky.
Samozřejmě tím, že nemáš poměr stran zobrazení 1:1, tak bude trochu pomačkaný.
center_x = (min(x) + max(x)) / 2
center_y = (min(y) + max(y)) / 2
t_start = ax.transData
c = mpl.transforms.Affine2D().translate(-center_x, -center_y)
r = mpl.transforms.Affine2D().rotate_deg(-45)
t_end = c + r - c + t_start
Když na to koukám víc, tak ještě tam máš ctr místo crt a řetězce v uvozovkách místo v apostrofech.
Vyplněný kruh můžeš vykreslit jako vyplněnou elipsu se stejně dlouhými poloosami.
SetColor(Green);
SetFillStyle(SolidFill, Blue);
FillEllipse(100, 100, 50, 50);
Příště si odpusť ty řeči okolo a jdi rovnou k věci.
Defunuješ proměnnou OutText a chceš použít funkci OutText. Nevzpomínám si, že by to Pascal dokázal nějak kontextově rozlišit, takže tam máš kolizi názvů.
OutText vykreslí text na aktuální pozici a MoveTo umožňuje nastavit aktuální pozici. Takže aby to vůbec mělo smysl, tak MoveTo musí být před OutText.
pole[index] = hodnota;
if (delky[i] > delky[i+1]) {
int pom = delky[i];
delky[i] = delky[i+1];
delky[i+1] = pom;
}
Nevím, co jsi zkoušel, ale v nastavení Appearance & Behavior je možnost změnit Theme. Mělo by tam být i světlé téma (Light).
Jednodušší bude, když budeš mít ty délky v poli. A to pole pak seřadíš.
Primitivní algoritmus řazení je porovnávat sousedící prvky pole a v případě potřeby je prohodit. A to celé opakovat tak dlouho, dokud není pole seřazené (v posledním průchodu nebylo potřeba nic prohodit).
Porovnání můžeš udělat if-em.
if (pole1[i] > pole2[j]) {
pole3[i] = pole1[i];
} else {
pole3[i] = pole2[j];
}
#4 Keyzio
Ordinální (pořadová) hodnota znaku je to, co jsem popsal. Jestli to je to, co chceš, tak to funguje správně.
Pokud chceš načítat (víceciferná) čísla, tak nedělej vlastní konverzi (i když se takovými low-level věcmi hodně naučíš), ale použij funkci pro načtení čísla. Třeba scanf("%d", &intpromenna).
Pokud někde opravdu potřebuješ vlastní konverzi znaku/číslice na číslo, tak neodečítej nicneříkající 48, ale zase znak '0'.
Tenkrát se používalo register_globals, které automaticky vytvářelo proměnné pro přijatá data. Stačí tam doplnit $_POST[] a ten for je tam takovej ošklivej :-)
<?php
if (@$_POST['odeslano'] === 'ano') {
$soubor = fopen('./data.csv', 'w');
foreach ($_POST['data'] as $radek) {
fwrite($soubor, implode('|', $radek) . "\n");
}
fclose($soubor);
}
echo '<form method="post">';
$radky = file('./data.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($radky as $i => $radek) {
$radek = explode('|', $radek);
foreach ($radek as $j => $hodnota) {
$escaped = htmlspecialchars($hodnota);
echo '<input type="text" name="data[' . $i . '][' . $j . ']" value="' . $escaped . '" />';
}
echo '<br>';
}
echo '<br><input type="hidden" name="odeslano" value="ano" /><input type="submit" />';
echo '</form>';
?>
Jednorázovou úpravu 140 záznamů bych asi nijak extra neřešil. Ale šlo by třeba importovat CSV do dočasné tabulky a udělat jeden UPDATE s JOINen (nebo subselectem).
Nemůžeš jen napsat zadání. Obzvlášť u triválního úkolu na něco, co jste nepochybně probírali. Co přesně nevíš?
Délka řetězce - String.length()
Část řetezce - String.substring()
Druhá odmocnina - Math.sqrt()
Mocnina - Math.pow() nebo násobení
No, neměň jejich šířku, nebo ne tak hodně. Mně se to nechce moc zkoumat, ale toto vyprodukuje co asi chceš.
# ax5
x = np.linspace(-1, 1, 100)
y = -x**2
ax5.set_ylim(-1.02, 0.3)
width_l = ax5.get_ylim()[1] - ax5.get_ylim()[0]
for t in np.linspace(0, 1, 40):
length = -0.1*width_l*t
ax5.plot(*get_parallels(length=length), color=cmap(t/2 + 0.25))
# ax6
x = np.linspace(-3, 3, 100)
y = -(1/4*x**4 - 1.6*x**2)
ax6.plot(x, y)
ax6.set_xlim(ax6.get_xlim()[0]-0.5, ax6.get_xlim()[1]+0.5)
ax6.scatter(1/2*(ax6.get_xlim()[0] + ax6.get_xlim()[1]), 1.2, marker = 'o', s=900, facecolors='none')
width_l = ax6.get_ylim()[1] - ax6.get_ylim()[0]
for t in np.linspace(1, 0, 40):
# XXX hardcoded
ax6.plot(*offset_curve(ax, x, y, -1000*t), color=cmap(t/2 + 0.25))
plt.show()
Ten přechod je plynulý, ale čáry jsou moc tlusté, takže je vidět jen/hlavně ta posledné světlá.
$("#response").html(msg);
Je otázka, co s tím datumem potřebuješ dělat, ale výběr v datepickeru můžeš odchytit v onSelect a data na server můžeš poslat AJAXem.
<?php
if (isset($_GET['action'])) {
if ($_GET['action'] == 'setdate') {
echo 'Zvoleny datum: ' . $_GET['date'];
}
exit;
}
?>
<html>
<head>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$(function() {
$("#datepicker").datepicker({
onSelect: function(date) {
setDate(date);
}
});
});
function setDate(date) {
$.ajax({
data: { action: 'setdate', date: date }
}).done(function(msg) {
$("#response").text(msg);
});
}
</script>
</head>
<body>
<div id="datepicker"></div>
<br>
<div id="response">???</div>
</body>
</html>
Dokumentace je tady. Pošleš HTTP dotaz na nějakou adresu s nějakými parametry a dostaneš odpověď jako XML.
Např. http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_std.cgi?ico=27074358
Requests samozřejmě JavaScript neinterpretuje.
V prohlížeči si otevři Developer Tools a na záložce Network bys měl vidět ten API request vyvolaný JavaScriptem. A ten dělej v tom svém programu.
Není mi jasné v čem je problém. Předpokládám to otevření PDF.
Windows CMD má příkaz start, který otevře soubor v programu asociovaným s danou příponou. Takže nejjednodušeji asi něco jako toto:
os.system("start cesta_k_souboru.pdf")
Co máš a na čem ses zaseknul?
V té funkci máš blbě odsazení a netuším co myslíš tím zobrazením výsledku.
To co se má provést vždycky, prostě nebude v podmíněném bloku.
Ale dejme tomu, že ty podmínky mají nějaký smysl a pak prostě můžeš tu testovanou proměnnou nastavit na požadovanou hodnotu.
#4 Mark123
A co na tom neumíš udělat? I kdybys to měl matlat appendama, tak je to věc na minutu.
sachovnice = []
for i in range(n):
radek = []
for j in range(n):
radek.append(" ")
sachovnice.append(radek)
sachovnice[0][0] = "!"
Už potřetí je tady stejné zadání a pokaždé nemáte hotový ani řádek.
Tkinter neumí načíst JPG, můžeš na to použít PIL.ImageTk.
Nevím, co přesně tím myslíš, ale obecně můžeš reagovat na různé události a implementovat tak výběr oblasti.
import tkinter as tk
import tkinter.filedialog as fd
def main():
root = tk.Tk()
canvas = tk.Canvas(root, width=640, height=480)
canvas.pack()
image = canvas.create_image(0, 0, anchor=tk.NW)
selrect = canvas.create_rectangle(0, 0, 0, 0)
filename = fd.askopenfilename(filetypes=[("GIF images", ".gif")])
if filename:
img = tk.PhotoImage(file=filename)
canvas.itemconfig(image, image=img)
def selstart(event):
canvas.coords(selrect, event.x, event.y, event.x, event.y)
def selupdate(event):
x1, y1, x2, y2 = canvas.coords(selrect)
canvas.coords(selrect, x1, y1, event.x, event.y)
canvas.bind("<Button-1>", selstart)
canvas.bind("<B1-Motion>", selupdate)
root.mainloop()
if __name__ == "__main__":
main()
No, seznam je snad jasný.
seznam = [1, 2, 3]
hodnota = seznam[index]
Takže třeba řádek může být list políček a šachovnice list řádků.
sachovnice = [
[11, 12, 13],
[21, 22, 23],
[31, 32, 33]
]
hodnota = sachovnice[cisloradku][cislosloupce]
Akorát ho vytvoříš a naplníš dynamicky. Je to jen šaškování s indexy, to bys měl zvládnout a ptát se konkrétně.
Ta úvaha s breakem byl nějaký brain-fart. To sice jde, ale samozřejmě by se taková situace řešila přímo v hlavičce toho cyklu -- while pocet < maximum. To jen pro doplnění
Cyklus while se dá ukončit příkazem break. Takže bys tam mohl mít počitadlo a po dosažení nějakého maxima to breaknout.
Ale spíš bych doporučil prostě použít cyklus for.
for _ in range(10):
provede se 10x
A při vyhodnocování odpovědí zase budeš aktualizovat nějaké počitadlo správných odpovědí.
A máš tam 6x stejný kod, zkus podmínit jen to, co se liší.
import random
print("="*100)
print("Nasobeni = 1")
print("Scitani = 2")
print("Odcitani = 3")
operace = int(input("Vyber si : "))
print("="*100)
print("Lehka = 1")
print("Tezka = 2")
obtiznost = int(input("Vyber si obtiznost: "))
if operace == 1:
operator = "*"
maxoperand = 9 if obtiznost == 1 else 20
elif operace == 2:
operator = "+"
maxoperand = 30 if obtiznost == 1 else 200
else:
operator = "-"
maxoperand = 30 if obtiznost == 1 else 200
spatne, spravne = 0, 0
for _ in range(10):
a = random.randint(1, maxoperand)
b = random.randint(1, maxoperand)
priklad = "%d %s %d" % (a, operator, b)
vysledek = eval(priklad)
print(priklad)
odpoved = int(input("Kolik to je?: "))
if odpoved == vysledek:
print("Správně")
spravne += 1
else:
print("Špatně")
spatne += 1
print("Správně", spravne)
print("Špatně", spatne)
Mám na mysli to, že třeba pro hodnotu 0 ten cyklus projde [-1, 0, 1]. Takže bude potřebat vyloučit/ošetřit hodnoty mimo rozsah.
Můžeš tu oblast prostě projít dvojitým cyklem.
for yy in range(y-1, y+2):
for xx in range(x-1, x+2):
if pole[yy][xx] != volno:
obsazeno
Akorát to trochu uprav, aby ti souřadnice nevylezly mimo pole.
Co znamená více předmětů najednou? Jak přesně to má fungovat?
To opakovaně počítá průměr nějakého počtu čísel, takže to asi zadání splňuje a netuším na co se ptáš.
Jen odkomentuj to nulování sumy.
A ty známky nepotřebuješ mít uložené, tak zruš to pole a s tím i omezení počtu známek.
A pro ukončení by asi počet 0 dával větší smysl než 100.
Nechápu, co myslíš vypisováním na jeden řádek. Vstup na jednom řádku bude fungovat.
Počet máš v cnt a vypisuješ sum/n.
Nebo možná až dvojnásobek, pokud AreaSeries potřebuje v obou setech stejný počet bodů.
#5 Kubas
FunctionSeries dělá to samé, takže jich bude stejný počet.
Zřejmě místo FunctionSeries s funkcí, vygeneruješ jednotlivé body a použiješ AreaSeries s těmi body.
Zkušenost s tím nemám, ale po letmém zkouknutí dokumentace bych řekl, že chceš AreaSeries.
Ano, regex sám o sobě nic nenahrazuje, jen napasuje popsaný vzor na data. Když to má začátek/prostředek/konec (ABC), tak to musíš popsat všechno a pak si z toho vytáhneš, co chceš (AC).
U některého z minulých dotazů jsi měl nějakou vizualizaci/vysvětlení regexu, tak se tam na to podívej.
,---------------- začátek skupiny
|,--------------- libovolný znak
||,-------------- 0 nebo více opakování
|||,------------- co nejkratší match
|||| ,------- konec skupiny
|||| |
vvvv v
(.*?(;|$)){10} -- 10 opakování
^^^^^
|||||
||||`-------- konec skupiny
|||`--------- konec dat/řádku
||`---------- nebo
|`----------- středník
`------------ začátek skupiny
Takže jsi správně poznamenal, že ten tvůj pokus je nesmysl :-)
Nevím kde, jak a k čemu to používáš, tak nevím, jestli půjde ten prostředek nějak vynechat, ale obecně máš prostě AA BB CC a vezmeš si z toho jen AA a CC.
^(([^;]*;){3}).*;(([^;]*;){3})$
Začátek je ve skupině 1 a konec ve skupině 3.
.*KW.*
Pokud ty názvy nejsou nějaké pakárny, tak to můžeš hodit rovnou do toho selektoru, ne? Místo url rovnou image1.
Jinak ten výsledek můžeš projít a podle libosti vyfiltrovat.
$('span[style*="url"]').filter(function() {
return $(this).css('background').includes('image1');
});
Ono záleží na tom jaké funkci v jakém jazyce to předhodíš. Nejspíš bude potřeba to ještě ukotvit -- na začátek ^ -- a výsledek bude v grupě 0 (všechno co se matchlo, tj. těch N hodnot).
Pak je ještě otázka, co s tím chceš dál dělat, jestli nebude lepší prostě nějaký string.split.
A jestli je to opravdu CSV, tak hodnoty s oddělovačem budou v uvozovkách, a uvozovky v hodnotách budou zdvojené, a bůhví co ještě. To se prostě regexama nedělá.
Počet opakování jde určit pomocí {počet} / {od,do}.
(.*?(;|$)){3}
Já bych ještě doplnil, že r"" vypíná escape sekvence, takže v tom stringu nemáš odřádkování, ale doslova lomítko-er-lomítko-en.
Po každém tahu se nastavuje, že je na řadě další hráč. Takže ten, který je na řadě, není ten, který udělal konečný tah.
Žádná randomizace tam není. Máš výšku a vynásobíš ji koeficientem odrazu.
Výška je v metrech, když je pod 1m, tak ji vypíšeš v centimetrech.
if (vyska < 1.0)
cout << vyska * 100 << " cm";
else
cout << vyska << " m";
V cyklu budeš přičítat nebo násobit. Napiš, co přesně nevíš.
Tady je to s diagramy, mělo by z toho být jasné, jak různé cykly fungují:
Teda #include, ne #import
Nainstaluj ty knihovny pipem do standardního umístění, nebo je zkopíruj k tomu programu, nebo Pythonu řekni kde jsou - PYTHONPATH před spuštěním, sys.path za běhu.
PyCharm instaluje knihovny "bokem" a při spouštění programu Pythonu říká, kde jsou. Jinak o nich Python neví.
Já jsem myslel, že win32api je součástí Windowsové verzi Pythonu. Zjevně není, ale měl bys mít k dispozici ctypes, takže by toto mělo chodit i bez doinstalovávání knihoven.
import ctypes
@ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint)
def zavirame(ctrl_type):
...
ctypes.windll.kernel32.SetConsoleCtrlHandler(zavirame, True)
Jinak proces jde vždycky sestřelit tak, že na to nemůže reagovat a bylo by lepší věci dělat tak, abys to nepotřeboval.
Ve Windows? Toto by mohlo chodit:
import sys, win32api
def zavirame(ctrl_type):
print('nashledanou')
sys.exit(0)
win32api.SetConsoleCtrlHandler(zavirame, True)
Pochybuju, že by šlo nastavit formát v jakém se data kopírují do schránky i o tom, že by se to kopírovalo v takovémto formátu. Schválně to zkus vložit do jiného programu, jestli to bude stejné. Při nejhorším holt budeš dělat ten export, tj. ukládat do souboru.
Každopádně Excel má nějaké možnosti nastavení formátu dat, tak buď to zprasí až Excel, nebo to v něm půjde aspoň přeformátovat. Tak koukni do nastavení. Já ho nepoužívám, tak nevím.
Načte to celý obsah souboru (pokud existuje).
První parametr bind_param určuje typ dalších parametrů. Teď to bude "s".
$stmt->bind_param("s", $_GET["nazev"]);
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
for (int i = 0; i < 10; i++) {
System.out.println(line);
}
Mně s tím seřazením šlo o to, že to je primitivní a řeší to všechny body najednou.
cout << "Povrch je: " << x << " m3" << endl;
Místo hromady testů všech možností můžeš ty hodnoty prohodit a omezit počet těch možností. A to klidně až tak, že prostě ty hodnoty seřadíš.
// prohodi hodnoty, aby platilo a <= b
void sort(int &a, int &b)
{
if (a > b) {
int x = a;
a = b;
b = x;
}
}
int main()
{
...
sort(n1, n2);
sort(n1, n3);
sort(n2, n3);
std::cout << "min " << n1 << ", mid " << n2 << ", max " << n3 << "\n";
}
Představ si, že máš interface ClickHandler.
interface ClickHandler
{
void onClick();
}
Můžeš ho implementovat klasickou pojmenovanou třídou.
class ClickReporter implements ClickHandler
{
public void onClick() {
message("Nekdo na neco kliknul.");
}
}
A vytvářet její instanci, kde je potřeba.
ClickHandler a = new ClickReporter();
// a pak ho nekdo nekde pri kliknuti zavola
a.onClick();
A stejně tak anonymní třídou definovanou v místě použití.
ClickHandler b = new ClickHandler() {
public void onClick() {
message("Tralala.");
}
};
// a pak ho nekdo nekde pri kliknuti zavola
b.onClick();
Proč to tak je v tom tvém příkladě? Protože se tak prostě autor rozhodl. V onCreate se buttonu nastavuje ClickListener, implementace je krátká a nikde jinde se nepoužije, tak je definovaná takhle. A taky takto "vidí data okolo" - jako tu metodu speak.
Je spousta způsobů kódování textu a je potřeba aby všichni věděli s čím pracují. To ř jako F8 vypadá na Windows-1250 a pokud to nikde nespecifikuješ, tak se to nějak automaticky detekovalo.
Dnes nemá smysl používat nic jiného než Unicode v UTF-8. Takže nejdříve se ujisti, že máš ten skript uložený v UTF-8 (každý slušný editor to dnes umí nastavit) a pak to kódování uveď i v dokumentu. (Ještě na to mý vliv hlavička Content-Type při přenosu, ale ta ti to v tomhle případě nejspíše nerozbíjí.)
Takhle nějak by to mohlo chodit:
<?php
$htmldata = htmlspecialchars(@$_REQUEST['data'] ?: 'ěščřžýáíé');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
Data: <?= $htmldata ?>
<form>
<input type="text" name="data" value="<?= $htmldata ?>" />
<input type="submit" />
</form>
</body>
</html>
Stejně tak pokud třeba používáš SQL, tak i tomu je pak potřeba říct, že texty jsou/budou v UTF-8. Způsob záleží na použité komunikační knihovně.
Parametry z URL jsou v poli $_GET, testovat jejich přítomnost můžeš funkci isset a v SQL můžeš filtrovat pomocí WHERE.
Nezkoušel jsem to, ale takhle nějak by to mohlo chodit.
if (isset($_GET["id"])) {
$stmt = $conn->prepare("SELECT nazev, datum, text, img FROM clanky WHERE id = ?");
$stmt->bind_param("i", $_GET["id"]);
$stmt->execute();
$result = $stmt->get_result();
} else {
$sql = "SELECT nazev, datum, text, img FROM clanky ORDER BY nazev";
$result = $conn->query($sql)
}
Parametry jsou součástí adresy. clanek.php?id=1 a clanek.php?id=23 jsou různé adresy.
Ale jinak se tomů říká Hezké URL a je to v podstatě neviditelné přesměrování, takže se třeba pro /clanky/123 fakticky načte clanky.php?id=123. Fantazii se meze nekladou, pogoogli a určitě najdeš variantu, která ti bude vyhovovat.
To je běžná praxe, klidně to tak nech. Akorát ne někde uprostřed kódu (který verzuješ/archivuješ), ale v samostatném konfiguračním souboru.
Bezpečné je to jenom tak, jak je bezpečný ten server/webovka.
Funkce htmlspecialchars konvertuje znaky, které maji v HTML speciální význam na odpovídající HTML entity. Třeba < na <. Takže je určená na vkládání dat do HTML a nemá nic společného s SQL.
Na ruční escapování SQL zapomeň a použij Prepared Statements, které to vyřeší.
(2 << int(val * 0.32)) - 1
Toto, pokud to správně chápu
(1 << int(val * 0.32)) - 1