Próbuję wziąć całą tablicę pocztową i umieścić każdą wartość w instrukcję SELECT, która zaktualizuje poprzednią wartość. Mam problemy z tym w PHP z ucieczką.

To jest oświadczenie SQL, które próbuję przejść:

UPDATE test1l.testtable SET age=106, weight=345, WHERE id=11

Strona zgłoszenia najpierw umieszcza tablicę $ _POST w zmiennej. Następnie próbuję ustawić oświadczenie, aby każda zmienna post była we właściwym miejscu.

$dataArray = $_POST;
$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']"

Single i podwójne cytaty bawią moje oświadczenia. Ponadto mam funkcję niestandardową, która ma charakter uciekający do tych strun, aby pomóc zatrzymać wstrzyknięcie.

0
lodkkx 17 grudzień 2011, 01:24

5 odpowiedzi

Najlepsza odpowiedź

Użyj konkatenacji:

'update ... SET age = ' . $dataArray['age'] . ', weight = ...'

I upewnij się, że walidację i prawidłowo uciekł, aby uniknąć atrybutów SQL. Lub nawet lepiej: Użyj przygotowanych stwierdzeń, aby mieć pewność. Zobacz http://php.net/manual/fr/mysqli.prepare.php.

2
JB Nizet 16 grudzień 2011, 21:31

Przechowuj zweryfikowane wejścia użytkownika (mysql_real_escape_string W przypadku nieznanego wejścia) W zmiennej, a następnie użyj sprintf jak pokazano poniżej. Ta linia kodu nigdy się nie pęka, chyba że niektóre z zmiennych nie są zdefiniowane lub jeśli informacje o bazie danych są nieprawidłowe.

$query = sprintf("UPDATE test1l.testtable SET age='%s', weight='%s' WHERE id='%s'", $age, $weight, $id);
1
Rob W 16 grudzień 2011, 21:28

Coś takiego było bezpieczniejsze:

$dataArray = $_POST; 
$Sql =" UPDATE test1l.testtable SET age=?, weight=? WHERE id=?";
$Statement = $mysqli->prepare($Sql);
$Statement->bind_param('iii', $dataArray['age'], 
                              $dataArray['weight'], 
                              $dataArray['id']);
$Statement->execute();
1
Frank 16 grudzień 2011, 21:45

Jeśli idziesz w takim formacie:

$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']"

Należy to zrobić:

$Sql ="UPDATE test1l.testtable SET age={$dataArray['age']},weight={$dataArray['weight']} WHERE id={$dataArray['id']}";

Musisz otoczyć złożone zmienne, takie jak tabliczka i obiekty z {} podczas pracy w podwójnych cytatach.

$string = "print {$object->param} and {$array['key']}";

Nie zapomnij również o zapytaniu do radzenia sobie ze wszystkimi dziedzinami całkowitymi - gdy dostaniesz pola łańcuchowe w DB jak Varchar, Char, Tekst - Zapytanie musi otoczyć je w pojedynczych cytatach:

$Sql ="UPDATE test1l.textfield SET textfield='{$dataArray['age']}' WHERE id={$dataArray['id']}";

Również, jak wspomniano o dowolnej zmiennej opartej na wejściu użytkownika przeznaczonego do części ustawy SQL, powinny być stosowane albo parametryzowane instrukcje lub funkcję MySQL_REAL_ESCE_String.

Jako uwagę, w którym musisz się zmienić w formacie budynku strunowego bardziej jak:

$sql= 'UPDATE test1l.testtable SET age='.mysql_real_escape_string($dataArray['age']).', weight='.mysql_real_escape_string($dataArray['weight']).' WHERE id='.mysql_real_escape_string($dataArray['id']);

Idealnie wyodrębniesz to w funkcji wielokrotnego użytku, która dezynfekcja wszystkich pól przeznaczonych do bazy danych z MySQL_REAL_ECPE_String, więc nie musisz robić tak brzydkich / nieczytelnych ciągów SQL.

1
codercake 16 grudzień 2011, 22:14

Robię to tak

$mysqli->query("UPDATE test1l.testtable SET age='".$dataArray['age']."',
            weight='".$dataArray['weight']."' WHERE id='".$dataArray['id']."' ")

Wystarczy włączyć cię nieświadomy, możesz usunąć kleszcze z wewnątrz wsporników: $dataArray[age]

0
Johnny Craig 16 grudzień 2011, 21:38