Eli olen tullut tieni päähän?
En vain keksi mikä ihme SQL-queryssäni on vikana.
Tälläisen varoituksen kyseinen juttu antaa kun ajan kyseisen koodin php-cli:llä (ensimmäisestä querystä)
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/teemu/bot/poista.php on line 12
DELETE FROM putka_rpguntil WHERE nick = 'zak------'
Poistoon.txt sisältää tälläistä dataa
putka:zak------
putka:zak-
Mikähän queryssä on väärin / koodissa, että tuo antaa kyseisen virheilmoituksen?
Kun ajan mysqltoolssin querybrowserilla kyseisen queryn niin se toimii.
Kyllä, minulla on kyseinen table tuossa schemassa kun yritän ajaa tätä skriptiä.
<?php $nickit = file_get_contents("poistoon.txt"); $nck = explode("\n", $nickit); $con = mysql_connect("127.0.0.1", "root", "salasana piilotettu"); if ($con) { mysql_select_db("mysql", $con); for ($i=0;$i<=count($nck)-1;$i++) { $kk = explode(":", $nck[$i]); $qr = "DELETE FROM {$kk[0]}_rpg WHERE nick = '{$kk[1]}'"; $qr = str_replace("\n", "", $qr); $qr = str_replace("\r", "", $qr); mysql_query($con, $qr); $qr = "DELETE FROM {$kk[0]}_rpguntil WHERE nick = '{$kk[1]}'"; $qr = str_replace("\n", "", $qr); $qr = str_replace("\r", "", $qr); echo $qr ."\n"; mysql_query($con, $qr); } } mysql_close($con); ?>
Ainakin tuossa on parametrit väärinpäin:
mysql_query($con, $qr);
Joo tuo auttoi kyseiseen skriptiin, mutta mulla on nettisivulla pyörivä samainen skripti. Kyseisessä skriptissä parametrit ovat oikeinpäin, mutta se antaa silti kyseisen errorin.
Kyllä se virheilmoitus on aivan oikeassa, kannattaa jatkossa uskoa sitä ja katsoa ilmoitettua riviä tarkemmin. Joko muuttuja $con on väärä (väärin kirjoitettu tai unohdettu alustaa) tai siinä muusta syystä on väärää sisältöä.
Kannattaa heti yhdistämisen jälkeen tarkistaa, että se onnistui, ja hoitaa virhetilanne loppuun asti. Jos yhdistäminen ei onnistunut, $con luonnollisesti sisältää jotakin muuta kuin toimivan MySQL-linkin ja tulee tuo virhe. Nythän sinulla on esimerkiksi mysql_close-kutsu ehtolauseen ulkopuolella.
Voisiko kyseisellä virheilmoituksella olla tekemistä sen kanssa, että käytän sivullani checkbokseja joiden namena on multi[]
Sen jälkeen parsin ne jotka on valitettu ja loopissa ajan queryn, joka poistaa kyseiset tiedot.
Query näyttää validilta kyllä kun sen tulostan, mutta jostain syystä se ei mene kantaan.
Ei voi. Mieti nyt järkevästi, keksitkö itsekään mitään syytä, miten se edes voisi vaikuttaa asiaan.
Virheilmoituksessa lukee kyllä täsmälleen, mistä on kyse, kuten edellisessäkin viestissäni yritin selittää. Tarkista nimenomaan siinä mainittu rivi ja sillä olevat muuttujat, erityisesti parametrien järjestys ja se $con, josta virheilmoitus valittaa.
Muuta yhdistämisessä tarkistus mieluummin näin päin tässä vaiheessa, kun olet vielä hukassa virheilmoitusten kanssa:
Jos vain on PHP5
käytössä (kuten pitäisi nykyään jo olla), suosittelisin käyttämään vähintään MySQLi
-lisäosaa oliopohjaisesti. Lisäksi die
-komentorakenteen tilalle mieluummin nykyään poikkeuksen heitto kera poikkeuskäsittelijän määrittelyn (PHP4
-koodeissa trigger_error
ja set_error_handler
). Muutettaessa sivustoa julkiseksi ei tarvitse siten muistaa kuin korvata exceptionhandleri sen sijaan, että pyyhkisi erikseen kaikki die
/exit
-käskyt.
Virheenkäsittelijä ja virheet
<?php /* Testaamatonta koodia, mutta perusperiaate tämä */ class ExceptionHandler { public static function handleException(Exception $e) { /* * Hypoteettinen tilanne, jossa sivusto sijaitsee rajoitetussa * testausympäristössä, ja virheet tulostetaan suoraan sivulle. */ echo 'Exception ' . get_class($e) . '<br />Message: ' . $e->getMessage() . "<br />\n"; // poikkeukset saa logattua tiedostoon php.ini-asetuksia muuttamalla } } class ConnectionException extends Exception { } ?>
Sivujen koodissa
<?php // Tämä kannattaa tietenkin laittaa johonkin bootloaderiin set_exception_handler(array('ExceptionHandler', 'handleException')); $link = new MySQLi($host, $user, $pass, $db); if ($link->connect_error !== '') /* * Tai lyhemmin if ($link->connect_error). Itse vain * tykkään huomattavasti enemmän sellaisesta merkintätavasta, * josta näkee suoraan, minkä tyyppistä dataa metodilta on * odotettavissa. */ // heitetään poikkeus throw new ConnectionException('Connection error: ' . $link->connect_error); } ?>
MySQLi lauseet ovat paremman turvallisuutensa lisäksi myös nopeampia, mikäli johnjawedin benchmarkkeja on uskominen. Ainahan on myös PDO...
Metabolix kirjoitti:
Ei voi. Mieti nyt järkevästi, keksitkö itsekään mitään syytä, miten se edes voisi vaikuttaa asiaan.
Virheilmoituksessa lukee kyllä täsmälleen, mistä on kyse, kuten edellisessäkin viestissäni yritin selittää. Tarkista nimenomaan siinä mainittu rivi ja sillä olevat muuttujat, erityisesti parametrien järjestys ja se $con, josta virheilmoitus valittaa.
Muuta yhdistämisessä tarkistus mieluummin näin päin tässä vaiheessa, kun olet vielä hukassa virheilmoitusten kanssa:
Olen koodannut 5 vuotta myslin ja PHP:n parissa ja olen tarkistanut sivun koodissa $con ja $qr:n järjestyksen 100 kertaan ja ne ovat oikeinpäin.
Silti kyseinen juttu antaa kyseisen virheilmoituksen.
Tässä vielä nettisivujen koodista oleva funktio.
<?php function delete_name($channel, $nick) { $con3 = mysql_connect("127.0.0.1", "root", "salasana piilotettu"); if ($con3) { $qr = "DELETE FROM {$channel}_rpg WHERE nick = '{$nick}'"; $qr2 = "DELETE FROM {$channel}_rpguntil WHERE nick = '{$nick}'"; echo $qr ."<br>"; echo $qr2 ."<br>"; if (mysql_query($qr, $con3)) { echo "Valid query!<br>"; } else { echo "Invalid query!<br>"; } if (mysql_query($qr2, $con3)) { echo "Valid query!<br>"; } else { echo "Invalid query!<br>"; } } else { echo "Can't connect<br>"; } mysql_close($con3); } ?>
Funktiota kutsutaan jokaisen nimen kohdalla, mutta ainoastaan ensimmäinen nimi lähtee kannasta; tämän jälkeen antaa samaisen virheilmoituksen.
tesmu kirjoitti:
Olen koodannut 5 vuotta myslin ja PHP:n parissa ja olen tarkistanut sivun koodissa $con ja $qr:n järjestyksen 100 kertaan ja ne ovat oikeinpäin.
Valitettavasti suuressa maailmassa vaikuttaa enemmän lopputulos kuin se, montako vuotta sitä on vääntänyt.
tesmu kirjoitti:
Funktiota kutsutaan jokaisen nimen kohdalla, mutta ainoastaan ensimmäinen nimi lähtee kannasta; tämän jälkeen antaa samaisen virheilmoituksen.
Tuossa koodissa sinänsä ei näy virhettä. Mistä rivistä ilmoitus tulee?
Onko jokin järkevä syy avata joka kerta uusi yhteys? Vaikkei tällä ehkä pitäisikään olla koodin toimintaan vaikutusta, ainakin nopeusedun pitäisi olla varsin huomattava, jos avaisit vain yhden yhteyden.
Suuressa maailmassa myös kokemus koodaamisesta kasvaa mitä kauemmin kielellä vääntää.
mysql_query -funktio ei palauta true eikä falsea jolloin tuo tulostaa "Invalid Query"
Nimiä poistetaan niin vähän kerrallaan, että tuo funktio kelpaa siihen aivan loistavasti.
Ilmoitus tulee siis rivistä mysql_query
Mitä tämä koodi sanoo:
<?php function delete_name($channel, $nick) { $con3 = mysql_connect("127.0.0.1", "root", "salasana piilotettu"); if ($con3) { $qr = "DELETE FROM {$channel}_rpg WHERE nick = '{$nick}'"; $qr2 = "DELETE FROM {$channel}_rpguntil WHERE nick = '{$nick}'"; echo $qr ."<br>"; echo $qr2 ."<br>"; if (mysql_query($qr, $con3)) { echo "Valid query!<br>"; } else { echo "Invalid query! ".mysql_error()."<br>"; } if (mysql_query($qr2, $con3)) { echo "Valid query!<br>"; } else { echo "Invalid query! ".mysql_error()."<br>"; } mysql_close($con3); } else { echo "Can't connect! ".mysql_error()."<br>"; } } ?>
Itselläni joskus tulee MySQL:in ja PHP:n kanssa koodatessa tuollaisia "se on ihan oikein"-virheitä. Täysin tarkkaa vastausta tässä en nyt tiedä, mutta itse lähtisin kokeilemaan noiden heittomerkkien poistamista kyselyissä (siis '-merkit, ei "-merkit), tai lisäämään heittomerkkejä taulun nimen ympärille kyselyssä. Voi kuulostaa oudolta, mutta kokeilemisessa ei menetä mitään.
Voisit myös koittaa korvata '-merkit `-merkeillä. Ei tiedä jos tulos olisi erillainen.
erakko- kirjoitti:
Itselläni joskus tulee MySQL:in ja PHP:n kanssa koodatessa tuollaisia "se on ihan oikein"-virheitä. Täysin tarkkaa vastausta tässä en nyt tiedä, mutta itse lähtisin kokeilemaan noiden heittomerkkien poistamista kyselyissä (siis '-merkit, ei "-merkit), tai lisäämään heittomerkkejä taulun nimen ympärille kyselyssä. Voi kuulostaa oudolta, mutta kokeilemisessa ei menetä mitään.
Voisit myös koittaa korvata '-merkit `-merkeillä. Ei tiedä jos tulos olisi erillainen.
Ei ehkä kannata koskea kyselyyn, koska sehän on oikein. Tulkki generoi kyllä virheilmoituksen, jos kysely ei ole hyvin muodostettu. Tässähän virhe oli nimenomaan huonosti muodostettu mySql linkki, kuten virheilmoitus varsin selvästi ilmoittaa.
Kokeilemalla summamutikassa jotakin, tuottaa harvoin järkevän lopputuloksen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.