sql >> Databáze >  >> RDS >> Mysql

Upozornění:mysql_query():zadaný argument není platným zdrojem MySQL-Link

Na základě komentářů se zdá, že problém je způsoben použitím require_once() uvnitř funkce.

Děje se jedna ze dvou věcí. Buď:

  1. Již jste zahrnuli Connection.php někde jinde, takže když se dostanete k funkci, ve skutečnosti není zahrnuta.. kvůli jednomu součástí require_once .

    nebo...

  2. Je funguje při prvním volání funkce, ale při druhém volání je soubor již zahrnut a nebude znovu zahrnut.

Problém je v tom, že když je soubor poprvé zahrnut (za předpokladu, že je to z této funkce), $connection proměnná je vytvořena v rozsahu funkce a jako každá jiná funkční proměnná je na konci funkce pryč. Když funkci zavoláte podruhé, k zahrnutí nedojde, protože používáte require_once .

Pravděpodobně byste to mohli opravit voláním require() místo require_once() , ale to skončí opětovným připojením k databázi pokaždé, když funkci zavoláte - což je spousta zbytečné režie. Je mnohem čistší přesunout zahrnutí mimo funkci a buď předat spojení do funkce, nebo jej použít jako globální proměnnou.

To by vypadalo takto:

require_once('Connection.php');

function getResult() {
    global $connection;

    $findQuery = "SELECT * FROM `Keys` WHERE `ID` = '$gID'";
    $findResult = mysql_query($findQuery, $connection) or die(mysql_error());
    $resultRow = mysql_fetch_assoc($findResult) or die(mysql_error());
} 

Jak již bylo řečeno, tento kód má 2 hlavní problémy.

  1. Používáte mysql_* funkce, které jsou zastaralé a budou brzy odstraněny z nových verzí PHP. Další podrobnosti naleznete v této otázce:Proč by neměl Nepoužívám funkce mysql_* v PHP?

    Ve skutečnosti není tak těžké přejít na něco jako mysqli_* funkce místo toho – existuje neobjektová sada funkcí, které jsou téměř totožné s tím, co nyní používáte.

  2. Zahrnujete do dotazu proměnnou, aniž byste ji správně escapovali. Přinejmenším byste měli volat mysql_real_escape_string() (nebo mysqli_real_escape_string() ), ale lepším řešením je podívat se do připravených výpisů. Více informací o připravených výpisech naleznete zde:Jak mohu zabránit vkládání SQL v PHP?




  1. Maximální využití paměti MySQL

  2. Jak zjistit, zda řetězec obsahuje speciální znaky?

  3. Klauzule IN v mysql nodejs

  4. Jak napsat parametrizovaný dotaz na vložení Oracle?