sql >> Database >  >> RDS >> Mysql

SQLSTATE[42000]:Syntaxisfout of toegangsfout:1064

Dit is de oorzaak van de fout:

$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);

Zoals Michael Berkowski en Andrewsi opmerkten in opmerkingen, kun je geen waarde binden aan :subdomain tijdelijke aanduiding omdat het niet wordt vermeld als dat in de zoekopdracht en zelfs als het is PDO-plaatshouders kunnen alleen worden gebruikt voor waarden, niet voor database-, tabel- of kolomnamen .

Als u dat soort SQL-query's dynamisch wilt laten maken, moet u database-, tabel- of kolomnamen tussen aanhalingstekens plaatsen (in het geval dat uw kolommen en namen door SQL gereserveerde trefwoorden bevatten die de zoekopdracht kunnen breken) en escape-waarden die zijn geplaatst, maar u kunt MySQLi niet gebruiken daarvoor als u al PDO gebruikt .

Aangezien PDO niet wordt geleverd met real_escape_string() methode die precies dat zou doen, en in de praktijk is het niet nodig om dergelijke waarden te escapen (tenzij je echt kolommen hebt met de naam Ye'name wat totaal stom is IMHO), dus eenvoudig filteren met preg_match() of preg_replace() is goed genoeg:

if (preg_match('/^[\w_]+$/i', $this->subdomain)) {
    // note the ` (backtick), and using " (double quotes):
    $this->data->query("CREATE TABLE `{$this->subdomain}`"); 
} else {
    // throw exception or error, do not continue with creating table
}

Slechts enkele voorbeelden van het gebruik van ' (enkel aanhalingsteken - apostrof) tegen " (dubbele aanhalingstekens) tekenreeksen in PHP:

$a = 1;
$b = 2;
echo '$a + $b'; // outputs: $a + $b
echo "$a + $b"; // outputs: 1 + 2
$c = array(5, 10);
echo '\$c[0] = {$c[0]}'; // outputs: \$c[0] = {$c[0]}
echo "\$c[0] = {$c[0]}"; // outputs: $c[0] = 5

De {} string met dubbele aanhalingstekens wordt gebruikt voor toegang tot arrays en objecteigenschappen en kan worden gebruikt rond reguliere variabelen.
Escaping $ tussen dubbele aanhalingstekens wordt gedaan door \$ anders zal het een variabele aanroep aannemen.



  1. FOUT 2002 (HY000):Kan geen verbinding maken met lokale MySQL-server via socket '/tmp/mysql.sock'

  2. Is er een truc om MySQL toe te staan ​​een volgkomma in de SET-clausule van een UPDATE-instructie te negeren?

  3. SQL Server - Wat gebeurt er wanneer een rij in een tabel wordt bijgewerkt?

  4. Hoe kan ik alleen in een database invoegen als een waarde is gewijzigd?