NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
IT rekvalifikace s podporou uplatnění. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!

Diskuze: Mysql_fetch_array problém

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jakub Mudra
Tvůrce
Avatar
Jakub Mudra:9.9.2012 13:35

Ahoj,mam problém u fora,nebufuje mi $rows=mysql_fet­ch_array($resul­t); ,zde j e celý kod souboru kde je $rows=mysql_fet­ch_array($resul­t); :

<?php

$host="localhost"; // Host name
$username="parbamine"; // Mysql username
$password="*****"; // Mysql password
$db_name="test1"; // Database name
$tbl_name="forum_question"; // Table name

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

// Get value of id that sent from hidden field
$id=$_POST['id'];

// Find highest answer number.
$sql="SELECT MAX(a_id) AS Maxa_id FROM $tbl_name WHERE question_id='$id'";
$result=mysql_query($sql);
$rows=mysql_fetch_array($result);

// add + 1 to highest answer number and keep it in variable name "$Max_id". if there no answer yet set it = 1
if ($rows) {
$Max_id = $rows['Maxa_id']+1;
}
else {
$Max_id = 1;
}

// get values that sent from form
$a_name=$_POST['a_name'];
$a_email=$_POST['a_email'];
$a_answer=$_POST['a_answer'];

$datetime=date("d/m/y H:i:s"); // create date and time

// Insert answer
$sql2="INSERT INTO $tbl_name(question_id, a_id, a_name, a_email, a_answer, a_datetime)VALUES('$id', '$Max_id', '$a_name', '$a_email', '$a_answer', '$datetime')";
$result2=mysql_query($sql2);

if($result2){
echo "Successful<BR>";
echo "<a href='view_topic.php?id=".$id."'>View your answer</a>";

// If added new answer, add value +1 in reply column
$tbl_name2="forum_question";
$sql3="UPDATE $tbl_name2 SET reply='$Max_id' WHERE id='$id'";
$result3=mysql_query($sql3);
}
else {
echo "ERROR";
}

// Close connection
mysql_close();
?>

Dik za odpověd

Editováno 9.9.2012 13:40
Odpovědět
9.9.2012 13:35
Uvnitř jsou všichni stejní...
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Jakub Mudra
David Jančík:9.9.2012 13:42

Musíš oddělovat proměnné od stringu: "' . $id . '" Jinak je tam spousta injekcí. Je lepší použít nějaký fw třeba dibi nebo použít mysqli.

Nahoru Odpovědět
9.9.2012 13:42
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Jakub Mudra
Tvůrce
Avatar
Jakub Mudra:9.9.2012 13:45

Asi jo,ale prořád sem nevyřešil,prečo mi to nejde

Nahoru Odpovědět
9.9.2012 13:45
Uvnitř jsou všichni stejní...
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na David Jančík
David Hartinger:9.9.2012 13:46

Nemusí, proměnné fungují takhle v dvojitých uvozovkách. Je tam hodně chyb, kdyby to byl jeho kód, tak bych mu je opravil, ale přijde mi zbytečné opravovat něco zkopírovaného.

Editováno 9.9.2012 13:47
Nahoru Odpovědět
9.9.2012 13:46
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jakub Mudra
Kit:9.9.2012 13:50

Ani se mi to nechtělo číst celé. Nejprve si oprav SQL injection, máš jich tam hromadu. Čísla se nedávají do apostrofů a máš tam race condition, neboli souběh. SELECT je zbytečný.

Zkus ho vyhodit možná se to tím vyřeší.

Co znamená "nebufuje"?

Nahoru Odpovědět
9.9.2012 13:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jakub Mudra
Tvůrce
Avatar
Odpovídá na Kit
Jakub Mudra:9.9.2012 14:08

překlep

Nahoru Odpovědět
9.9.2012 14:08
Uvnitř jsou všichni stejní...
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jakub Mudra
David Hartinger:9.9.2012 14:13

Nějak takhle vypadaly zdrojové kódy původního Islandsoftu :D Tohle je opravdu začátečnické, plné chyb a ještě zkopírované.

Koukni do sekce PHP, je tam seriál pro začátečníky, je tam vysvětleno vše co potřebuješ. Tohle by bylo opravdu na dlouho takhle ve fóru.

Nahoru Odpovědět
9.9.2012 14:13
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jakub Mudra
Kit:9.9.2012 14:19

Pokud dokážeš reagovat jen na poslední (prakticky zbytečnou) větu, tak je to skutečně vážné a obávám se, že to spravit nepůjde.

Nahoru Odpovědět
9.9.2012 14:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na David Hartinger
David Jančík:9.9.2012 20:06

Aha, nevšiml jsem si uvozovek. Tenhle vejmysl s apostrofy a uvozovky je fakt strašnej :D

Nahoru Odpovědět
9.9.2012 20:06
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na David Jančík
David Hartinger:9.9.2012 20:20

To jsi ještě neviděl Ruby, to je teprve peklo :D

PHPčko je hodně magický, ale já si na to zvykl jak píšu ty manuály a ten jazyk se mi fakt líbí. Když člověk ví co jak funguje, tak se v tom dělá hezky.

Nahoru Odpovědět
9.9.2012 20:20
New kid back on the block with a R.I.P
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na David Hartinger
David Jančík:9.9.2012 20:24

Já mám spíš problém se čtením. Čtu mezi řádky a hodně přeskakuju. Jak jsem viděl tu proměnnou v textu tak mě to zmátlo. Jak teď dělám v tom C#, není tam sprintf ani spojování stringu . tak je to hrozný nezvyk. Osobně si myslím, že psát to takhle není dobrý, dost se to pak dá přehlídnout. Buďto použít již zmíněný formátovaný text nebo spojovníky. Jaký na to máš názor ty?

Nahoru Odpovědět
9.9.2012 20:24
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na David Jančík
David Hartinger:9.9.2012 20:28

V C# je String.Format, dělá to to samé, jako sprintf. V C# to používám pořád. V PHP by se ty proměnné měly balit do {}, je to lépe vidět a highlighter to zvýrazňuje. sprintf jsem v PHP moc používat neviděl, proto to nedělám, naopak v C# se formátuje v MSDN stále.

Editováno 9.9.2012 20:28
Nahoru Odpovědět
9.9.2012 20:28
New kid back on the block with a R.I.P
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na David Hartinger
David Jančík:9.9.2012 20:30

Však ano, to jsem myslel.

Nahoru Odpovědět
9.9.2012 20:30
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Hartinger
Vlastník
Avatar
Nahoru Odpovědět
9.9.2012 20:31
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na David Jančík
David Hartinger:9.9.2012 20:32

"Jak teď dělám v tom C#, není tam sprintf ani spojování stringu ."

Je tam String.Format i konkatenace. Názor mám takový, že by to měl dát do složenic, tedy "text {$promenna} text" nebo "text ${promenna} text". Nevím, která verze se používá více.

Nahoru Odpovědět
9.9.2012 20:32
New kid back on the block with a R.I.P
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na David Hartinger
David Jančík:9.9.2012 20:36

Myslel jsem to tak, že jak teď poslední dobou dělám hlavně v C# tak v tom PHP kódu není sprintf ani spojování "." ale je ta proměnná přímo v textu, tak že mě to zmátlo. Protože v C# se buďto použije String.Format nebo spojování "+". Žádné proměnné v textu. Preferuji, že by se mělo používat právě těchto dvou metod i v PHP. A proto jsem se ptal, jaký máš názor na používání proměnných natvrdo v textu.

Nahoru Odpovědět
9.9.2012 20:36
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Jančík
Kit:10.9.2012 12:48

V PHP se dělají různá zvěrstva, dobře se dělá i s Heredoc. Má oblíbená konstrukce:

$objekt=new Data(parametry_pro_vytažení_dat_z_databáze);
echo <<<EOT
Přímý výstup HTML,
do kterého vložím naformátovaná data z
$objekt
a pak pokračuji další omáčkou.
EOT;

Používám to prakticky vždy, když nepoužívám výstupní šablonu v XSLT. Tedy hlavně v jednodušších aplikacích. Vyhnu se tak potřebě cyklů v šabloně.

Nahoru Odpovědět
10.9.2012 12:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.