php + PDO Update user data via array

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Jboy1991
  • Registratie: September 2012
  • Laatst online: 19:03
Goedendag,

In mijn laatste topic werd ik erop gewezen dat mysql binnen kort niet meer werkzaam zal zijn. Hierom ben ik bezig al mijn codes (database gericht) opnieuw te schrijven. Alleen loop ik nu vast op een update gedeelte van de users.

Ik heb een function gemaakt in deze functie is het van belang dat je de update gegevens en de userid mee stuurt.

De update gegevens is een een array met daarin de colomnaam plus de nieuwe date
array('U_NAME' => "test","
U_MAIL" => "blabla@blalbal.nl",
'U_ACTIEF' => true)

Nu is het de bedoeling dat PDO alleen de colommen update die mee gestuurd zijn via de array alleen ik blijf een error krijgen

code:
1
"SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\xampp\htdocs\****\mysql_test.php:78 Stack trace: #0 C:\xampp\htdocs\****\mysql_test.php(29): UpdateUser(1, Array) #1 {main} thrown in C:\xampp\htdocs\**\mysql_test.php on line 78"


Regel nummer 78 is:
code:
1
throw new Exception('Er is iets fout gegaan tijdens account activatie' . $e->getMessage());


Mn functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function UpdateUser($U_ID,$rows)
{
    if(!empty($U_ID) or !empty($rows))
    {
        if( preg_match("/[0-9]/",$U_ID))
        {
            if(is_array($rows))
            {
                
                $sql_update_data = "";
                $execute_array = "";
                
                foreach ($rows as $key => $value) 
                {
                        if($sql_update_data == "")
                        {
                            $sql_update_data = $key . " = :". $key;
                        }else
                        {
                            $sql_update_data = $sql_update_data .", ". $key . " = :".$key;
                        }
                        if(!is_array($execute_array))
                        {
                            $execute_array = array(":".$key => $value);
                        }else{
                            array_push($execute_array,":".$key , $value);
                        }
                }
                array_push($execute_array,":U_ID", $U_ID);
                $query = "UPDATE users SET ".$sql_update_data." WHERE U_ID=:U_ID";
                //var_dump ( array(':U_ID' => $U_ID , ':U_HASH' => "gfhdh","U_IP" => "3resgfg"));
                //echo "<br></br>";
                //var_dump($execute_array);
                try 
                {
                    global $db_connection;
                    $db = $db_connection->prepare($query); 
            $db->execute($execute_array);
                    
                }
                catch(PDOException $e) 
                {
                    throw new Exception('Er is iets fout gegaan tijdens account activatie' . $e->getMessage());
                    return "";
                }

            }else{
                //rows is geen array
                throw new Exception('Gewzijzigde data is geen array');
            }
        }else{
            //userId is geen nummer
            throw new Exception('Opgegeven ID klopt niet');
        }
    }else
    {
        //function vars zijn leeg
        throw new Exception('pgegeven variabele zijn leeg');
    }
    
}


En de array die uitgepoept wordt door $execute_array
code:
1
array(7) { [":U_NAME"]=> string(4) "test" [0]=> string(7) ":U_MAIL" [1]=> string(17) "blabla@blalbal.nl" [2]=> string(9) ":U_ACTIEF" [3]=> bool(true) [4]=> string(5) ":U_ID" [5]=> int(1) }


en de $query is:
code:
1
UPDATE users SET U_NAME = :U_NAME, U_MAIL = :U_MAIL, U_ACTIEF = :U_ACTIEF WHERE U_ID=:U_ID


Update:
Inmiddels opgelost, had geen array_push moeten gebruiken maar gebruik moeten maken van $execute_array[]

[ Voor 3% gewijzigd door Jboy1991 op 30-04-2017 15:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Apart trouwens dat je PDO gebruikt, en daarmee dan dynamisch een query gaat samenstellen - ik zou de manual nog even goed doornemen als ik jou was... ;)

Acties:
  • 0 Henk 'm!

  • Jboy1991
  • Registratie: September 2012
  • Laatst online: 19:03
Verwijderd schreef op zondag 30 april 2017 @ 16:07:
Apart trouwens dat je PDO gebruikt, en daarmee dan dynamisch een query gaat samenstellen - ik zou de manual nog even goed doornemen als ik jou was... ;)
Na mijn idee doe ik in dit geval niks verkeerds, Ik gebruik de meegezonden arrays omdat ik niet steeds alles opnieuw wil schrijven als ik enkel een paar (of 1) kolom wil wijzigen.

Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt gelijk - door het anders inspringen had ik de $db->execute over het hoofd gezien. ;)

Acties:
  • 0 Henk 'm!

  • MdBruin
  • Registratie: Maart 2011
  • Laatst online: 12-05-2024
Je zou nog eventueel een andere structuur kunnen gebruiken, heb deze aangeleerd van Alex (codecourses)
Checken op wat je niet verwacht en dan een error; exit; als laatste uitvoeren wat je wel verwacht. Maakt de code leesbaarder en kan je sneller zien waar het fout loopt/gaat.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function UpdateUser($U_ID,$rows) {

   if(empty($U_ID) || empty($rows)) {
      //function vars zijn leeg
      throw new Exception('Opgegeven variabele zijn leeg');
      exit;
   }

   if(!preg_match("/[0-9]/",$U_ID)) {
      //userId is geen nummer
      throw new Exception('Opgegeven ID klopt niet'); 
      exit;
   }

   // enz

   // doen wat je wilt
};


Je hebt trouwens nu de functie preg_match gebruikt, je zou ook is_numeric kunnen gebruiken. of te wel in mijn voorbeeld
code:
1
if(!is_numeric($U_ID)) { [..] }

Ben trouwens zelf nog aan het leren hoor, stukje bij beetje. Meer in de richting van OOP (wel eerst procedural en dan omzetten).

Acties:
  • 0 Henk 'm!

  • Jboy1991
  • Registratie: September 2012
  • Laatst online: 19:03
MdBruin schreef op maandag 1 mei 2017 @ 12:49:
Je zou nog eventueel een andere structuur kunnen gebruiken, heb deze aangeleerd van Alex (codecourses)
Checken op wat je niet verwacht en dan een error; exit; als laatste uitvoeren wat je wel verwacht. Maakt de code leesbaarder en kan je sneller zien waar het fout loopt/gaat.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function UpdateUser($U_ID,$rows) {

   if(empty($U_ID) || empty($rows)) {
      //function vars zijn leeg
      throw new Exception('Opgegeven variabele zijn leeg');
      exit;
   }

   if(!preg_match("/[0-9]/",$U_ID)) {
      //userId is geen nummer
      throw new Exception('Opgegeven ID klopt niet'); 
      exit;
   }

   // enz

   // doen wat je wilt
};


Je hebt trouwens nu de functie preg_match gebruikt, je zou ook is_numeric kunnen gebruiken. of te wel in mijn voorbeeld
code:
1
if(!is_numeric($U_ID)) { [..] }

Ben trouwens zelf nog aan het leren hoor, stukje bij beetje. Meer in de richting van OOP (wel eerst procedural en dan omzetten).
Het nadeel van is_nummeric is dat het ook negatieve getallen als getal zit (-3 bijv en 3.3) etc. Daarom gebruik ik dit zelden tot niet. Vooral niet bij het punt waarbij een user invloed heeft op de data

Acties:
  • 0 Henk 'm!

  • MdBruin
  • Registratie: Maart 2011
  • Laatst online: 12-05-2024
Jboy1991 schreef op maandag 1 mei 2017 @ 15:37:
[...]

Het nadeel van is_nummeric is dat het ook negatieve getallen als getal zit (-3 bijv en 3.3) etc. Daarom gebruik ik dit zelden tot niet. Vooral niet bij het punt waarbij een user invloed heeft op de data
Goed punt, echter de string die je aanbied staat het bij mij nog steeds toe.
Draai op PHP 7.0.10 met WAMP. De volgende string staat het niet meer toe (was even zoeken hoe en wat)

code:
1
preg_match("/^[[0-9]*$/i", $U_ID)


Alzo een goed punt om de data niet te vertrouwen, heb er zelf een functie voor gemaakt welke dit voor me regeld. Ook de uitgaande data uit de database heb ik de check op zitten. Mocht er iemand toch stiekum iets voor elkaar krijgen dan word het nog niet uitgevoerd.
code:
1
2
3
function escape($string) {
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

En ja het is nog maar een hele basic functie zo maar het helpt al behoorlijk.

[ Voor 0% gewijzigd door MdBruin op 01-05-2017 19:09 . Reden: was de * vergeten voor nummers > 9 ]

Pagina: 1