[mySQL] INT veld UPDATE, maar soms geen waarde..

Pagina: 1
Acties:
  • 135 views sinds 30-01-2008
  • Reageer

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ik zit met het volgende probleempje..

Ik voer een UPDATE query uit vanuit mijn PHP scriptje. Het gaan om gegevens die in de database gewijzigd moeten worden. Nu moet er ook een telefoonnummer geupdate worden (een INT veld), maar het kan natuurlijk zijn dat er geen waarde in wordt gevult. Dan valt mijn query helaas nogal in duigen:

Het gaat om de velden intMobiel & intICQ..
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    mysql_query("UPDATE `tblProfielen`
                SET 
                    `varVoornaam`       = '".$HTTP_POST_VARS['txtVnaam']."',
                    `varAchternaam`      = '".$HTTP_POST_VARS['txtAnaam']."',
                    `enumGeslacht`        = '".$HTTP_POST_VARS['slcGeslacht']."',
                    `datGeboortedatum`  = '".$HTTP_POST_VARS['txtGebDatJ'].$HTTP_POST_VARS['txtGebDatM'].$HTTP_POST_VARS['txtGebDatD']."',
                    `varWoonplaats`       = '".$HTTP_POST_VARS['txtWoonplaats']."',
                    `varWijk`          = '".$HTTP_POST_VARS['txtWijk']."',              
                    `varSchool`           = '".$HTTP_POST_VARS['txtSchool']."',
                    `varKlas`          = '".$HTTP_POST_VARS['txtKlas']."',                  
                    `varFoto`          = '".$HTTP_POST_VARS['txtFoto']."',
                    `intMobiel`         =  ".$HTTP_POST_VARS['txtMobiel'].",
                    `varMsn`        = '".$HTTP_POST_VARS['txtMsn']."',
                    `intIcq`        =  ".$HTTP_POST_VARS['txtIcq'].",
                    `varWebsite`        = '".$HTTP_POST_VARS['txtWebsite']."',
                    `txtHobbies`        = '".$HTTP_POST_VARS['txtHobbies']."',
                    `txtOverig`         = '".$HTTP_POST_VARS['txaOverig']."',
                    `txtBericht`        = '".$HTTP_POST_VARS['txaBericht']."' 
                WHERE
                    'intId' = ".$HTTP_SESSION_VARS['id']
        ) or die(mysql_error());

Als de waarde van $HTTP_POST_VARS['intMobiel'] nu leeg zou zijn, krijg je iets als

PHP:
1
UPDATE `tblProfielen` SET ..., intMobiel = , varMsn = 'waarde',.....

Dat wordt niet echt geaccepteerd.. Een oplossing zou zijn om er standaard een 0 voor te plakken, maar dat lijkt me niet de beste oplossing. Er is vast wel wat beters .... :?

[ Voor 36% gewijzigd door r0bert op 15-05-2003 21:08 ]


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Dynamische Queries.. ie.. maak je query in een string aan en dan voeg je alleen die dingen toe die veranderd moeten worden.

Had je ook zelf kunnen bedenken.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ja, maar dat is ook niet een beetje omslachtig :S Zou ik er dus beter een VARCHAR veld van kunnen maken, scheelt een hele hoop gedoe..

Snapt mysql dan niet, dat als er een komma in de query komt, er naar een nieuw record verwezen wordt ?

[ Voor 29% gewijzigd door r0bert op 15-05-2003 21:17 ]


Verwijderd

Simpeler (voorbeeld is niet compleet, alleen om een idee te geven):
PHP:
1
2
3
4
5
$postvars=$HTTP_POST_VARS;
foreach ($postvars as $key => $value) {
    $query.="'$key'=$value, ";
}
mysql_query($query);

En dan natuurlijk je veldnamen gelijk aan de formuliervelden (sowieso handiger). De uitzonderingen kun je van tevoren veranderen in $postvars:
PHP:
1
2
$postvars['datGeboortedatum'] = '".$postvars['txtGebDatJ'].$postvars['txtGebDatM'].$postvars['txtGebDatD'];
unset($postvars['txtGebDatJ'],$postvars['txtGebDatM'],$postvars['txtGebDatD']);

Je kunt ook van tevoren checken of bepaalde waardes kloppen.

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 22-08 10:45
r0bert schreef op 15 May 2003 @ 21:07:
Ik zit met het volgende probleempje..

Ik voer een UPDATE query uit vanuit mijn PHP scriptje. Het gaan om gegevens die in de database gewijzigd moeten worden. Nu moet er ook een telefoonnummer geupdate worden (een INT veld), maar het kan natuurlijk zijn dat er geen waarde in wordt gevult. Dan valt mijn query helaas nogal in duigen:

Het gaat om de velden intMobiel & intICQ..
zoiets kan je toch maken lijkt me niet zo heel omslachtig?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$query = "UPDATE `tblProfielen` SET ";
$query .= "..lalala..";

if (is_numeric($HTTP_POST_VARS['txtMobiel'])) {
$query .= "`intMobiel` =  ".$HTTP_POST_VARS['txtMobiel'].", ";
}

if (is_numeric($HTTP_POST_VARS['txtIcq'])) {
$query .= "`intIcq` =  ".$HTTP_POST_VARS['txtIcq'].", ";
}

$query .= "..etc.. ";   

mysql_query($query);

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
hmmz, ja, misschien ben ik beetje overdreven allergisch voor lange code ;) Misschien is het inderdaad handig om het dan meteen te combineren met een controle of de ingevoerde gegevens wel geldig zijn....

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Die controle moet je toch maken.

Definitie van SQL bepaald dat als je bij een update een column wilt updaten dat je ook moet zeggen waarin het veranderd moet worden.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 22-08 10:45
r0bert schreef op 15 May 2003 @ 21:30:
hmmz, ja, misschien ben ik beetje overdreven allergisch voor lange code ;) Misschien is het inderdaad handig om het dan meteen te combineren met een controle of de ingevoerde gegevens wel geldig zijn....
dan maak je van $HTTP_POST_VARS toch $_POST, scheelt weer wat :P

en ik zou zeker wat invoer controle doen als je dat nog niet hebt :)

gebruikers achter een webbrowser moet je gewoon niet vertrouwen.

invoer controle doe ik zelf met ereg of preg_match. voor een tel nummer gebruik ik bijv. deze regexp: "^[0-9 -]{8,}$";
mogen cijfers / spatie / streepjes in voor komen en minimaal 8 karakters

en als je dan toch bezig bent plak dan gelijk de functie mysql_real_escape_string om de $_POST values heen in de query :P

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ja, ik had wel iets van inputcontrole, maar dat was via onSubmit en JavaScript..

Dat escape gedoe zal ik er zeker nog inbouwen.. was het vanmiddag ook al ergens vergeten, maar kwam er gelukkig achter bij het testen :)

edit:

Ik heb het nu trouwens zo opgelost
globalHeader.php (wordt in elke pagina geinclude)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class fnMakeObject
{
    var $strInput, $strType, $fldOutput, $sqlQuery;
    
    function fnMakeObject($strInput, $regexpData, $strFldOutput, $bQuotes)
    {
        if(!preg_match($regexpData, $strInput)) return '';
        
        $this->strInput     = $strInput;
        $this->regExpType   = $regexpData;
        $this->fldOutput    = $strFldOutput;
        
        $strQuery = '`'.$strFldOutput.'` = ';
        $strQuery .= ($bQuotes)?"\'":"";
        $strQuery .= addslashes($strInput);
        $strQuery .= ($bQuotes)?"\'":"";
        
        $this->sqlQuery     = $strQuery;
    }
}


En dan in de pagina zelf met de query:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    $arrDynQueryObjects = Array();
    $arrDynQueryObjects[] = new fnMakeObject($HTTP_POST_VARS['txtVnaam'], '/(a-zA-Z]|.){0,50}/', 'varVoornaam', true);
    $arrDynQueryObjects[] = new fnMakeObject($HTTP_POST_VARS['txtAnaam'], '/(a-zA-Z]|.){0,50}/', 'varAchternaam', true);
    $arrDynQueryObjects[] = new fnMakeObject($HTTP_POST_VARS['slcGeslacht'], '/(m|v){1}/', 'enumGeslacht', true);
    $arrDynQueryObjects[] = new fnMakeObject('1984-12-05', '/[0-9]{2,4}.*/', 'datGeboortedatum', true); // even string als testinvoer gebruikt
    $arrDynQueryObjects[] = new fnMakeObject($HTTP_POST_VARS['txtWoonplaats'], '/.{0,50}/', 'varWoonplaats', true);

foreach ($arrDynQueryObjects as $intInt => $queryObj)
    {
        if ($intInt != count($arrDynQueryObjects)-1) $sqlQuery .= $queryObj->sqlQuery.',';
        else $sqlQuery .= $queryObj->sqlQuery;
    }
    
    mysql_query(stripslashes($sqlQuery)." WHERE `intId` = ".$HTTP_SESSION_VARS['id']) or die(mysql_error());


Maar zitten vast nog zat foutjes in wat betreft beveiliging e.d., suggesties zijn altijd welkom!

ps. niet op de RegExp letten, die zijn nogal ruim ;) .* bijv :P

[ Voor 91% gewijzigd door r0bert op 15-05-2003 23:19 ]

Pagina: 1