ugrás a tartalomhoz

Apró pici baki...nade mi?

superman · 2010. Júl. 16. (P), 20.45
Több órája csinálom, és már kifolyik a szemem. Mi a hiba? 99%, hogy az $sql változóval van baj.
$nick = $_POST['nick'];
            $email = $_POST['email'];
            $password = md5($_POST['password1']);
            $gender = $_POST['gender'];
            $regdate = date('Y-m-d');
            $sql = "INSERT INTO pets (id, nick, email, password, gender, money, regdate, status)
            VALUES('', '$nick', '$email', '$password', '$gender', '', '$regdate', '')";
            $query = mysql_query($sql) or die("Hiba történt az adatok küldése közben!");
            print("Sikeres regisztráció!");
A program ezzel tér vissza: Hiba történt az adatok küldése közben!
 
1

Biztonság

Poetro · 2010. Júl. 16. (P), 22.11
Azért legalább minimális biztonságot rakj bele, ha már nem ellenőrzöd, hogy amit megadott gender, vagy email az valid-e, akkor is legalább kódold megfelelően adatbázisba vitelkor.
<?php
$parameterek = array(
  'nick'     => $_POST['nick'],
  'email'    => $_POST['email'],
  'password' => md5($_POST['password1']),
  'gender'   =>  $_POST['gender'],
  'regdate'  => date('Y-m-d'),
);

$sql = call_user_func_array('sprintf', array_merge(
  array("INSERT INTO pets (id, nick, email, password, gender, money, regdate, status)  
          VALUES ('', '%s', '%s', '%s', '%s', 0, '%s', 1)"),
  array_map('mysql_real_escape_string', $parameterek)
));

$query = mysql_query($sql) or die("Hiba történt az adatok küldése közben!");
print "Sikeres regisztráció!"; 
?>
2

Előtte ezekkel ellenőrzöm az

superman · 2010. Júl. 16. (P), 22.23
Előtte ezekkel ellenőrzöm az adatokat:

if($_POST['nick'] == "" | $_POST['email'] == "" | $_POST['password1'] == "")
        {
            die("Minden mező kitöltése kötelező!");
        }
        elseif(strlen($_POST['nick']) < 3)
        {
            die("A nicknek minimum 3 karakterből kell állnia!");
        }
        elseif(strlen($_POST['nick']) > 15)
        {
            die("A nick maximum 15 karakterből állhat!");
        }
        elseif(!eregi("@.", $_POST['email']))
        {
            die("Mindenképpen létező email címet adj meg!");
        }
        elseif($_POST['password1'] != $_POST['password2'])
        {
            die("A két jelszó nem egyezik!");
        }
        elseif(strlen($_POST['password1']) < 5)
        {
            die("A jelszónak minimum 5 karakterből kell állnia!");
        }
        elseif(strlen($_POST['password1']) > 12)
        {
            die("A jelszó maximum 12 karakterből állhat!");
        }
        elseif(mysql_num_rows(mysql_query("SELECT nick FROM pets WHERE (nick='".$_POST['nick']."')")) > 0)
        {
            die("Ez a név már foglalt!");
        }
        elseif(mysql_num_rows(mysql_query("SELECT email FROM pets WHERE (email='".$_POST['email']."')")) > 0)
        {
            die("Ezzel az email címmel már regisztráltak!");
        }
        elseif($_POST['rules'] == false)
        {
            die("A regisztrációhoz el kell fogadni a Felhasználási Feltételeket!");
        }
És így is ugyan azt a hibát kapom.
3

Ellenőrzés

Poetro · 2010. Júl. 16. (P), 22.26
Most nem fogom kritizálni az ellenőrzést, pedig lehetne, inkább megnézném, hogy az adatbázis táblázatom létezik-e, ebben a formában, megfelelőek-e a mezőnevek, azok típusa, valamit hogy van-e adatbáziskapcsolat, valamint, hogy milyen hibát is ad vissza a MySQL.
4

Query ellenőrzés

Schmidi · 2010. Júl. 16. (P), 22.28
A $sql tartalmát a mysql_query futtatása előtt írasd ki a képernyőre, ott meglátod mit állított össze. Ha látszólag helyes, akkor copy-paste egy phpMyAdmin vagy MySQL konzolba, futtasd le, és megmondja mi a baj a query-vel.

Biztos passzol minden mezőnév? Nincs elírva semmi sem a queryben sem a táblában?

Esetleg ha végképp nem megy, másolj ide egy táblaszerkezet dumpot, hogy meg tudjuk nézni.
5

Itt

superman · 2010. Júl. 16. (P), 23.28
Importált SQL:
-- phpMyAdmin SQL Dump
-- version 2.11.4-rc1
-- http://www.phpmyadmin.net
--
-- Hoszt: sql4.ultraweb.hu:3306
-- Létrehozás ideje: 2010. Júl 16. 23:31
-- Szerver verzió: 4.1.22
-- PHP Verzió: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Adatbázis: `woodoocaudron`
--

-- --------------------------------------------------------

--
-- Tábla szerkezet: `pets`
--

CREATE TABLE IF NOT EXISTS `pets` (
  `id` int(11) NOT NULL auto_increment,
  `nick` varchar(15) collate latin2_hungarian_ci NOT NULL default '',
  `email` varchar(35) collate latin2_hungarian_ci NOT NULL default '',
  `password` varchar(50) collate latin2_hungarian_ci NOT NULL default '',
  `gender` varchar(6) collate latin2_hungarian_ci NOT NULL default '',
  `money` int(11) NOT NULL default '2000',
  `regtime` date NOT NULL default '0000-00-00',
  `status` varchar(7) collate latin2_hungarian_ci NOT NULL default 'BASIC',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 COLLATE=latin2_hungarian_ci AUTO_INCREMENT=1 ;

--
-- Tábla adatok: `pets`
--
newteen.php (egész)
<?php
session_start();
include("includes/config.php");
$connection = mysql_connect($dbHost, $dbUser, $dbPass); 
mysql_select_db($dbName);
?>
<html>
<head>
</head>
<body>
<?php
if($_SESSION['id'] == true)
{
    Header("Location: mypet.php");
}
else
{
    ?>
    <form method="post">
        <table>
            <tr>
                <td>
                    Nick
                </td>
                <td>
                    <input type="name" name="nick"/>
                </td>
            </tr>
            <tr>
                <td>
                    Email cím
                </td>
                <td>
                    <input type="name" name="email"/>
                </td>
            </tr>
            <tr>
                <td>
                    Jelszó
                </td>
                <td>
                    <input type="password" name="password1"/>
                </td>
            </tr>
            <tr>
                <td>
                    Jelszó újra
                </td>
                <td>
                    <input type="password" name="password2"/>
                </td>
            </tr>
            <tr>
                <td>
                    Nem
                </td>
                <td>
                    <select name="gender">
                    <option value="MALE">Fiú</option>
                    <option value="FEMALE">Lány</option>
                    </select>
                </td>
            </tr>
        </table>
        <table>
            <tr>
                <td>
                    <textarea readonly="disabled" cols="45" rows="10">Felhasználási Feltételek</textarea>
                </td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox" name="rules" value="true"/> Kijelentem, hogy elolvastam, és elfogadom a Felhasználási Feltételeket
                </td>
            </tr>
            <tr>
                <td>
                    <input type="submit" name="getmynewpet"value="Regisztráció"/>
                </td>
            </tr>
        </table>
    </form>
    <?php
    if(isset($_POST['getmynewpet']))
    {
        if($_POST['nick'] == "" | $_POST['email'] == "" | $_POST['password1'] == "")
        {
            die("Minden mező kitöltése kötelező!");
        }
        elseif(strlen($_POST['nick']) < 3)
        {
            die("A nicknek minimum 3 karakterből kell állnia!");
        }
        elseif(strlen($_POST['nick']) > 15)
        {
            die("A nick maximum 15 karakterből állhat!");
        }
        elseif(!eregi("@.", $_POST['email']))
        {
            die("Mindenképpen létező email címet adj meg!");
        }
        elseif($_POST['password1'] != $_POST['password2'])
        {
            die("A két jelszó nem egyezik!");
        }
        elseif(strlen($_POST['password1']) < 5)
        {
            die("A jelszónak minimum 5 karakterből kell állnia!");
        }
        elseif(strlen($_POST['password1']) > 12)
        {
            die("A jelszó maximum 12 karakterből állhat!");
        }
        elseif(mysql_num_rows(mysql_query("SELECT nick FROM pets WHERE (nick='".$_POST['nick']."')")) > 0)
        {
            die("Ez a név már foglalt!");
        }
        elseif(mysql_num_rows(mysql_query("SELECT email FROM pets WHERE (email='".$_POST['email']."')")) > 0)
        {
            die("Ezzel az email címmel már regisztráltak!");
        }
        elseif($_POST['rules'] == false)
        {
            die("A regisztrációhoz el kell fogadni a Felhasználási Feltételeket!");
        }
        else
        {
            $nick = $_POST['nick'];  
            $email = $_POST['email'];  
            $password = md5($_POST['password1']);  
            $gender = $_POST['gender'];  
            $regdate = date('Y-m-d');  
            $sql = "INSERT INTO pets (id, nick, email, password, gender, money, regdate, status)  
            VALUES('', '$nick', '$email', '$password', '$gender', '', '$regdate', '')";  
            $query = mysql_query($sql) or die("Hiba történt az adatok küldése közben!");  
            print("Sikeres regisztráció!");  
        }
    }
}
?>
</body>
</html>
Bocs, hogy bemásolok ide csak úgy mindent "ömlesztve", de már nincs ötletem.
6

Jajj megvaaan!!! Bocsi... nah

superman · 2010. Júl. 17. (Szo), 00.12
Jajj megvaaan!!! Bocsi... nah viszont ötleteket várok még, hogy mivel lehetne biztonságosabbá tenni. mysql_real_escape_stringet hova csempésszek be?:S
7

user

csman007 · 2010. Júl. 17. (Szo), 20.56
Az összes olyan mezőhöz aminél a kedves user adja be az adatokat, meg egy kis xss védelem sem ártana. A másik dolog, a php 5.3 az eregit nem nagyon szereti(deprecated). php 6-tól meg meg is szűnik.
8

id nem lehet ures string

dOMiNiS · 2010. Júl. 18. (V), 23.05
$sql = "INSERT INTO pets (nick, email, password, gender, money, regdate, status)    
            VALUES('$nick', '$email', '$password', '$gender', '', '$regdate', '')";
9

vagy NULL

plip · 2010. Júl. 19. (H), 04.56
Vagy id-nak adj meg NULL értéket ha auto_increment-es