[PHP] mysql_insert_id() geeft onverklaarbare error

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ekkoper
  • Registratie: Augustus 2003
  • Laatst online: 17-11-2024
Ik ontvang een error wanneer ik mijn script op een externe server (One.com) draai, maar niet op mijn eigen (WAMP) server.
Dit mailtje heb ik naar One.com gestuurd; misschien dat iemand me hier kan helpen?

-----
In een stuk PHP-code van de website staan de volgende regels:

mysql_query('INSERT INTO '.$GLOBALS['tbl'].'weblog_comments (`weblogid`, `'.$author_key.'`, `text`, `created`) VALUES ("'.$_GET['id'].'", "'.$author.'", "'.encode($_POST['comment_text']).'", "'.date('Y-m-d H:i:s').'") ');
$insert_id = mysql_insert_id();

De query werkt naar behoren (geen errors en er wordt netjes een record toegevoegd), maar ik krijgt een foutmelding van mysql_insert_id():

Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in /customers/scoutinggva.nl/scoutinggva.nl/httpd.www/reunie/functions/func_user.php on line 130

Wanneer ik de code op mijn eigen (WAMP) server draai, ontstaat dit probleem niet, maar op de One.com-server dus wel.

Kunt u mij vertellen wat er aan de hand kan zijn?
----

Ik hoop dat iemand mij kan helpen.
Groeten,
Eduard

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Error:
supplied argument is not a valid MySQL-Link resource
Manual:
link_identifier
The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If no connection is found or established, an E_WARNING level error is generated.
If mysql_insert_id() returns 0 or null, check that you have also included the link identifier. It is optional but if you have more than one database connection then this is necessary.
Geef eens een link_identifier mee?

En:
Note: Because mysql_insert_id() acts on the last performed query, be sure to call mysql_insert_id() immediately after the query that generates the value.
Weet je zeker dat dit precies de code is zoals jij 'm hebt of staan er nog zaken tussen zoals het sluiten van de connectie ofzo?

En verder: Wat heb je zelf al geprobeerd/gezocht/gevonden? Heb je al gedebugged? Debuggen: Hoe doe ik dat?

[ Voor 48% gewijzigd door RobIII op 10-02-2010 12:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Offtopic: Je weet dat jouw code zo lek als een mandje is? SQL injection is een groot feest, je doet geen enkele poging om je database te beschermen...

http://wiki.phpfreakz.nl/SQLInjectie

Gebruik in dit geval mysql_real_escape_string() op de userinput, GET en POST, werkt prima. Vergeet niet om magic_quotes uit te zetten, die ellende wil je niks mee te maken hebben.

Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 10-09 20:55
@ekkoper
Heb je je query (mysql_query) in een variabele gezet? Zo niet, moet je dat even doen en deze variabele meegeven aan mysql_insert_id.
Heeft als het goed is iets te maken met de instellingen wel op de server.

Acties:
  • 0 Henk 'm!

  • ekkoper
  • Registratie: Augustus 2003
  • Laatst online: 17-11-2024
Ik heb al gezocht op google, maar kon eigenlijk niets zinnigs vinden over deze melding.

Vooral het feit dat he top mijn eigen server vlekkeloos lijkt te werken en op de externe niet, leek me relevant.

Die twee regels code staat direct na elkaar; er wordt dus niet tussentijds een andere handeling verricht met de database.

Ik zal zeker eens wat aanpassingen doen aan de code wat de SQLInjectie betreft, bedankt!

Maar goed, iemand een idee waar deze fout door kan komen?

Acties:
  • 0 Henk 'm!

  • ekkoper
  • Registratie: Augustus 2003
  • Laatst online: 17-11-2024
jbdeiman schreef op woensdag 10 februari 2010 @ 12:36:
@ekkoper
Heb je je query (mysql_query) in een variabele gezet? Zo niet, moet je dat even doen en deze variabele meegeven aan mysql_insert_id.
Heeft als het goed is iets te maken met de instellingen wel op de server.
Dat heb ik ook (als eerste) geprobeerd, maar maakte geen verschil.
Oorspronkelijk gebruikte ik trouwens een eigen functie om de query uit te voeren, maar ook zonder die functie (zoals nu getoond) krijg ik de error.

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 17:37

DexterDee

I doubt, therefore I might be

Waar doe je je mysql_connect? De resource link die je daar terug krijgt wordt óf hergebruikt óf je geeft 'm specifiek mee aan het mysql_query commando.

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

cariolive23 schreef op woensdag 10 februari 2010 @ 12:34:
Offtopic: Je weet dat jouw code zo lek als een mandje is? SQL injection is een groot feest, je doet geen enkele poging om je database te beschermen...

http://wiki.phpfreakz.nl/SQLInjectie

Gebruik in dit geval mysql_real_escape_string() op de userinput, GET en POST, werkt prima. Vergeet niet om magic_quotes uit te zetten, die ellende wil je niks mee te maken hebben.
En jouw glazen bol verteld wat encode($_POST['comment']) doet? :) Misschien is dat wel een eigen functie, die dat soort dingen (mbt SQL injection) afdicht... :)

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
GJtje schreef op woensdag 10 februari 2010 @ 12:50:
[...]
En jouw glazen bol verteld wat encode($_POST['comment']) doet? :) Misschien is dat wel een eigen functie, die dat soort dingen afdicht... :)
Wat dacht je van de GET? Daar heb ik echt geen glazen bol voor nodig. En wanneer dat één keer voorkomt in één query, dan durf ik wel te wedden dat het in meerdere queries voorkomt. Komt bij dat deze wel héél erg zichtbaar is, dit lek is niet verstopt in eigen variabelen die je het leven moeilijk maken.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

GJtje schreef op woensdag 10 februari 2010 @ 12:50:
[...]
En jouw glazen bol verteld wat encode($_POST['comment']) doet? :) Misschien is dat wel een eigen functie, die dat soort dingen afdicht... :)
En $_GET['id'] dan? :)

@TS: post eens wat relevante code.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • ekkoper
  • Registratie: Augustus 2003
  • Laatst online: 17-11-2024
cariolive23 schreef op woensdag 10 februari 2010 @ 12:53:
[...]

Wat dacht je van de GET? Daar heb ik echt geen glazen bol voor nodig. En wanneer dat één keer voorkomt in één query, dan durf ik wel te wedden dat het in meerdere queries voorkomt. Komt bij dat deze wel héél erg zichtbaar is, dit lek is niet verstopt in eigen variabelen die je het leven moeilijk maken.
Heel fijn, deze discussie, en ik zal er zeker wat mee doen.
Maar misschien gaat dit te ver af van het topic?

Acties:
  • 0 Henk 'm!

  • ekkoper
  • Registratie: Augustus 2003
  • Laatst online: 17-11-2024
Ergens heel ver terug in de code (dmv include() ):

mysql_connect($host, $username, $password) or die(mysql_error());
mysql_select_db($database) or die(mysql_error());

Wat voor relevante code wil je verder kunnen zien?

Omdat de code wel gewoon werkt op de ene server, en niet op een andere en daarbij de SQL ook zonder problemen verloopt, lijkt het me te liggen aan de instellingen op de externe server..


edit: misschien wel handig als ik ook de GOEDE code plak:

$q_newuser = mysql_query('INSERT INTO '.$GLOBALS['tbl'].'user (`username`, `password`, `email`, `name`, `active`) VALUES ("'.$_POST['username'].'", "'.md5($_POST['password']).'", "'.$_POST['email'].'", "'.$_POST['name'].'", "N")') or die(mysql_error());
$newid = mysql_insert_id($q_newuser);

(of dus zonder $_q_newuser in de mysql_insert_id)

[ Voor 74% gewijzigd door ekkoper op 10-02-2010 13:04 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

ekkoper schreef op woensdag 10 februari 2010 @ 12:58:
Wat voor relevante code wil je verder kunnen zien?
De code die rond regel 130 staat. Is dat niet een totaal andere regel dan waar "mysql_query('INSERT INTO [...]
$insert_id = mysql_insert_id();"" staat?
Omdat de code wel gewoon werkt op de ene server, en niet op een andere en daarbij de SQL ook zonder problemen verloopt, lijkt het me te liggen aan de instellingen op de externe server..
Staat error reporting wel aan op je lokale server, of heb je toevallig lokaal ook last van deze fout maar zie je hem alleen niet?
edit: misschien wel handig als ik ook de GOEDE code plak:
PHP:
1
2
$q_newuser = mysql_query('INSERT INTO '.$GLOBALS['tbl'].'user (`username`, `password`, `email`, `name`, `active`) VALUES ("'.$_POST['username'].'", "'.md5($_POST['password']).'", "'.$_POST['email'].'", "'.$_POST['name'].'", "N")') or die(mysql_error());
$newid = mysql_insert_id($q_newuser);

(of dus zonder $_q_newuser in de mysql_insert_id)
Best handig ja, want $q_newuser is geen link identifier.

[ Voor 26% gewijzigd door CodeCaster op 10-02-2010 13:08 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Gebruik de edit knop ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ) als je iets toe te voegen hebt; je topic herhaaldelijk omhoogschoppen is niet nodig.
ekkoper schreef op woensdag 10 februari 2010 @ 12:58:
edit: misschien wel handig als ik ook de GOEDE code plak:
Wel zo handig ja. Vandaar ook:
RobIII schreef op woensdag 10 februari 2010 @ 12:30:
Weet je zeker dat dit precies de code is zoals jij 'm hebt
ekkoper schreef op woensdag 10 februari 2010 @ 12:58:
$q_newuser = mysql_query('INSERT INTO '.$GLOBALS['tbl'].'user (`username`, `password`, `email`, `name`, `active`) VALUES ("'.$_POST['username'].'", "'.md5($_POST['password']).'", "'.$_POST['email'].'", "'.$_POST['name'].'", "N")') or die(mysql_error());
$newid = mysql_insert_id($q_newuser);

(of dus zonder $_q_newuser in de mysql_insert_id)
:X Wat denk je dat $q_newuser is?
For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error.
Je maakt mij niet wijs dat je gedebugged hebt; dan had je $q_newuser gedumpt en gezien dat 't zinloos is die mee te geven aan mysql_insert_id

[ Voor 89% gewijzigd door RobIII op 10-02-2010 13:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ekkoper
  • Registratie: Augustus 2003
  • Laatst online: 17-11-2024
Het probleem is opgelost.
Doordat ik de code iets had aangepast om het in een mail te sturen aan de provider (One.com) had ik blijkbaar iets vreemds aangepast.
Ik heb er toen overheen gekeken en het niet handig aangepakt.
Mijn excuses voor de onnodige hulp; al heb ik me daardoor wel gerealiseerd dat er iets mis was.

Dank je wel allemaal.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ekkoper schreef op woensdag 10 februari 2010 @ 13:11:
al heb ik me daardoor wel gerealiseerd dat er iets mis was.
En die error deed je dat niet ook realiseren? :P
Het komt maar zelden voor dat een error/warning er langs zit. Als je dus een error even (begrijpend) leest hoef je in 9 v.d. 10 gevallen niet meer te doen dat 't probleem dat 'ie aangeeft op te lossen ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Hopelijk heb je nu wel al je code aangepast, de boel is zo lek als een mandje, extreem gevoelig voor SQL injection. En dit probleem zit ongetwijfeld in ieder script dat je ooit hebt gemaakt waar queries in staan, het lijkt me sterk dat je beveiliging toevallig met dit ene script bent vergeten.

Succes!

Acties:
  • 0 Henk 'm!

  • Makkelijk
  • Registratie: November 2000
  • Laatst online: 20:05
Even om het topic wel nuttig te maken voor de naslag. Een link identifier gebruiken voor mysql_insert_id() (en andere functies) doe je dus zo:

PHP:
1
$connection = mysql_connect($host, $username, $password) or die(mysql_error());


Later in je code:
PHP:
1
mysql_insert_id($connection)

Badieboediemxvahajwjjdkkskskskaa


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 17:12

AW_Bos

Liefhebber van nostalgie... 🕰️

En die $connection is niet eens verplicht, zolang je maar 1 identifier gebruikt.
Bij MySQLi is dat geloof ik anders.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes

Pagina: 1