2016-08-15 4 views
0

У меня возникли проблемы с получением моего SQL-запроса для «вставки в» моей базы данных, разрешено ли использовать переменные как имя таблицы, имя поля и значения?Вставить в переменные php mysql

Вот мой код:

$nameOfDBFromA = "vagtplanA" . $_GET["from"]; 

$flytnedToQ1 = $con->prepare("SELECT * FROM $nameOfDBToA WHERE ansatId='$_GET[ansatId]' ORDER BY id DESC"); 
$flytnedToQ1->execute(); 
$flytnedTo1 = $flytnedToQ1->fetch(); 

$nameOfFieldToA1 = "a" . $_GET["to"] . "1"; 
$nameOfFieldToA2 = "a" . $_GET["to"] . "2"; 
$nameOfFieldToA3 = "a" . $_GET["to"] . "3"; 
$nameOfFieldToA4 = "a" . $_GET["to"] . "4"; 
$nameOfFieldToA5 = "a" . $_GET["to"] . "5"; 
$nameOfFieldToA6 = "a" . $_GET["to"] . "6"; 
$nameOfFieldToA7 = "a" . $_GET["to"] . "7"; 

$redigeringsTidspunkt = date("j M Y"); 

$flytnedTA = $con->prepare(
     "INSERT INTO $nameOfDBFromA 
       (ansatId, edit, $nameOfFieldToA1, $nameOfFieldToA2, 
       $nameOfFieldToA3, $nameOfFieldToA4, $nameOfFieldToA5, 
       $nameOfFieldToA6, $nameOfFieldToA7) 
      VALUES($_GET[ansatId], $redigeringsTidspunkt, 
       $flytnedTo1[$nameOfFieldToA1], $flytnedTo1[$nameOfFieldToA2], 
       $flytnedTo1[$nameOfFieldToA3], $flytnedTo1[$nameOfFieldToA4], 
       $flytnedTo1[$nameOfFieldToA5], $flytnedTo1[$nameOfFieldToA6], 
       $flytnedTo1[$nameOfFieldToA7]) ") 
      or die(mysql_error()); 
$flytnedTA->execute(); 

РЕШИТЬ! Я просто кладу в нее массивы собственной переменной

$intoVarToA1 = $flytnedTo1[$nameOfFieldToA1]; 
$intoVarToA2 = $flytnedTo1[$nameOfFieldToA2]; 
$intoVarToA3 = $flytnedTo1[$nameOfFieldToA3]; 
$intoVarToA4 = $flytnedTo1[$nameOfFieldToA4]; 
$intoVarToA5 = $flytnedTo1[$nameOfFieldToA5]; 
$intoVarToA6 = $flytnedTo1[$nameOfFieldToA6]; 
$intoVarToA7 = $flytnedTo1[$nameOfFieldToA7]; 
+0

Я подозреваю, что это могут быть массивы в разделе значений? –

+0

вы не цитировали ЛЮБОЕ из ваших значений, поэтому почти 99.999999% у вас есть проблема с [sql injection] (http://bobby-tables.com). И поскольку 'mysql _ *()' не имеет подготовленных операторов, вы, вероятно, ТАКЖЕ смешаете mysql apis, который также не будет работать. 'mysql_error()' может сообщать только о ошибках, вызванных функциями mysql _ *(), ** NOT ** mysqli или pdo. –

+0

Извините, что я не размещал больше своего кода в соответствующем контексте. Кавычки в значениях не решают проблему, ive попробовал это тысячу раз, с и без. Это должно работать, есть что-то с синтаксисом, о котором я не знаю. Все мои переменные имеют то, что им нужно содержать. проверили их столько раз. –

ответ

0

Одна из ваших ошибок состоит в том, когда вы хотите получить доступ значение в массиве внутри строки, вы не можете сделать:

"$flytnedTo1[$nameOfFieldToA1]" 

Вы должны сделать это так:

"{$flytnedTo1[$nameOfFieldToA1]}" // use curly brackets 
+0

Просто попробовал тоже тот же результат. Я уверен, что вы правы в синтаксисе, но должно быть что-то еще происходит. –

+0

Не удалось вывести выход ввода функции prepare(). Это должно помочь нам определить проблему. Ie $ test = "INSERT INTO $ nameOfDBFromA (ansatId, edit, $ nameOfFieldToA1, $ nameOfFieldToA2, $ nameOfFieldToA3, $ nameOfFieldToA4, $ nameOfFieldToA5, $ nameOfFieldToA6, $ nameOfFieldToA7) VALUES ('$ _GET [ansatId]', '$ redigeringsTidspunkt' {$ flytnedTo1 [$ nameOfFieldToA1]} ',' {$ flytnedTo1 [$ nameOfFieldToA2]} ',' nameOfFieldToA5]} ',' {$ flytnedTo1 [$ nameOfFieldToA6]} ',' {$ flytnedTo1 [$ nameOfFieldToA7]} ') "; echo $ test; – printfmyname

+0

здесь: INSERT INTO vagtplanA1 (ansatId, edit, a21, a22, a23, a24, a25, a26, a27) VALUES ('5', '', '', '', '', '', '', ',' ',' ') –

0

Если у вас есть такие переменные, как это, вы можете вставить данные в БД, как показано ниже в PHP.

$first_name = mysqli_real_escape_string($link, $_POST['firstname']); 
    $last_name = mysqli_real_escape_string($link, $_POST['lastname']); 
    $email_address = mysqli_real_escape_string($link, $_POST['email']); 
    $sql = "INSERT INTO persons (first_name, last_name, email_address) VALUES ('$first_name', '$last_name', '$email_address')"; 
+1

Этот метод подвержен риску [SQL Injection Attack] (http: // stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Посмотрите, что случилось с [Little Bobby Tables] (http://bobby-tables.com/) Даже [ если вы избегаете входных данных, это небезопасно!] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) Используйте [подготовленный оператор и параметризованные утверждения ] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly

+0

Спасибо, Риггс! Я посмотрел подготовленные заявления. Обычно я кодирую запросы в yii2 Active Record. –

0

Не является хорошей практикой ставить _GET, _POST переменных непосредственно по запросу, используйте mysqli_real_escape_string, чтобы очистить значение переменной.

Значение массива не анализируется непосредственно в строках, необходимо заключить выражение в {}:

Для этого: " $flytnedTo1[$nameOfFieldToA3] " заменить: "'{$flytnedTo1[$nameOfFieldToA3]}'", значение результата также необходимо обнесено '' singlequoes для SQL строкового значения.

$flytnedTA = $con->prepare("INSERT INTO $nameOfDBFromA (ansatId, edit, $nameOfFieldToA1, $nameOfFieldToA2, $nameOfFieldToA3, 
    $nameOfFieldToA4, $nameOfFieldToA5, $nameOfFieldToA6, $nameOfFieldToA7) 
    VALUES({$_GET['ansatId']}, '$redigeringsTidspunkt', '{$flytnedTo1[$nameOfFieldToA1]}', '{$flytnedTo1[$nameOfFieldToA2]}', 
    '{$flytnedTo1[$nameOfFieldToA3]}', '{$flytnedTo1[$nameOfFieldToA4]}', '{$flytnedTo1[$nameOfFieldToA5]}', 
    '{$flytnedTo1[$nameOfFieldToA6]}', '{$flytnedTo1[$nameOfFieldToA7]}') ") or die(mysql_error()); 
+0

Просто попробовал не удачу .. Может быть, потому что у меня есть переменные как имена полей, ansatId, edit, $ nameOfFieldToA1, $ nameOfFieldToA2, $ nameOfFieldToA3, $ nameOfFieldToA4, $ nameOfFieldToA5, $ nameOfFieldToA6, $ nameOfFieldToA7? –

+0

Можете ли вы показать мне результат этой строки? 'Эхо«INSERT INTO $ nameOfDBFromA (ansatId, редактировать, $ nameOfFieldToA1, $ nameOfFieldToA2, $ nameOfFieldToA3, $ nameOfFieldToA4, $ nameOfFieldToA5, $ nameOfFieldToA6, $ nameOfFieldToA7) VALUES ({$ _ GET [ 'ansatId']}, «$ redigeringsTidspunkt ',' {$ flytnedTo1 [$ nameOfFieldToA1]} ',' {$ flytnedTo1 [$ nameOfFieldToA2]} ', ' {$ flytnedTo1 [$ nameOfFieldToA3]} ',' {$ flytnedTo1 [$ nameOfFieldToA4]} ',' {$ flytnedTo1 [$ nameOfFieldToA5]} ', ' {$ flytnedTo1 [$ nameOfFieldToA6]} ',' {$ flytnedTo1 [$ nameOfFieldToA7]} ') "' –

1

Вы не должны подставлять переменные в запрос, вы должны использовать bind_param() для предоставления значений параметров для подготовленного запроса.

$flytnedTA = $con->prepare(
     "INSERT INTO $nameOfDBFromA 
       (ansatId, edit, $nameOfFieldToA1, $nameOfFieldToA2, 
       $nameOfFieldToA3, $nameOfFieldToA4, $nameOfFieldToA5, 
       $nameOfFieldToA6, $nameOfFieldToA7) 
      VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?) ") 
      or die(mysqli_error($con)); 
$flytnedTA->bind_param("sssssssss", $_GET[ansatId], $redigeringsTidspunkt, 
       $flytnedTo1[$nameOfFieldToA1], $flytnedTo1[$nameOfFieldToA2], 
       $flytnedTo1[$nameOfFieldToA3], $flytnedTo1[$nameOfFieldToA4], 
       $flytnedTo1[$nameOfFieldToA5], $flytnedTo1[$nameOfFieldToA6], 
       $flytnedTo1[$nameOfFieldToA7]); 
$flytnedTA->execute(); 

Вы также должны вызвать mysqli_error($con), не mysql_error().

Смежные вопросы