MySQL запрос INSERT INTO и SET проблемы - PullRequest
3 голосов
/ 12 июня 2011

Я почесал голову в течение часа или около того, но не могу понять, что я здесь сделал неправильно. Я надеюсь, что кто-то может указать мне правильное направление.

Я пытаюсь вставить некоторые данные в базу данных SQL, используя метод INSERT INTO, но, похоже, это не работает. Я включил много эха, чтобы увидеть, попробуйте и посмотреть, где именно ошибка может быть. Из этого я знаю, что код в порядке, пока не будет вызвана часть INSERT INTO. Кроме того, проверяя базу данных в режиме онлайн, вы обнаруживаете, что информация не добавляется ... В базе данных в режиме онлайн есть 3 таблицы: «шум», «волна» и «импульс». Кроме того, все поля присутствуют, поэтому я действительно не могу понять, почему этот код не работает.

<?php
//Connect To Database
$hostname='myhostname';
$username='myusername';
$password='mypassword';
$dbname='dbname';
mysql_connect($hostname,$username, $password) OR DIE ('Unable to connect to database! Please try again later.');
mysql_select_db($dbname);

// test to see what kind of instrument is being uploaded.

$type=strip_tags($_GET['TYPE']);

if($type == 'noise') {
    $audio=strip_tags($_GET['AUDIO']); 
    echo $audio;
    $automate=strip_tags($_GET['AUTOMATE']);
    echo $automate;
    $by=strip_tags($_GET['BY']);
    echo $by;
    $envelope=strip_tags($_GET['ENVELOPE']);
    echo $envelope;
    $length=strip_tags($_GET['LENGTH']);
    echo $length;
    $name=strip_tags($_GET['NAME']);
    echo $name;
    $notes=strip_tags($_GET['NOTES']);
    echo $notes;
    $output=strip_tags($_GET['OUTPUT']);
    echo $output;
    $patchname=strip_tags($_GET['PATCH_NAME']);
    echo $patchname;
    $s_cmd=strip_tags($_GET['S_CMD']);
    echo $s_cmd;
    $shape=strip_tags($_GET['SHAPE']);
    echo $shape;
    $table=strip_tags($_GET['TABLE']);
    echo $table;
    $table0=strip_tags($_GET['table0']);
    echo $table0;
    $table1=strip_tags($_GET['table1']);
    echo $table1;
    $table2=strip_tags($_GET['table2']);
    echo $table2;
    $table3=strip_tags($_GET['table3']);
    echo $table3;
    $table4=strip_tags($_GET['table4']);
    echo $table4;
    $table5=strip_tags($_GET['table5']);
    echo $table5;
    $table6=strip_tags($_GET['table6']);
    echo $table6;
    $table7=strip_tags($_GET['table7']);
    echo $table7;
    $table8=strip_tags($_GET['table8']);
    echo $table8;
    $table9=strip_tags($_GET['table9']);
    echo $table9;
    $tableA=strip_tags($_GET['tableA']);
    echo $tableA;
    $tableB=strip_tags($_GET['tableB']);
    echo $tableB;
    $tableC=strip_tags($_GET['tableC']);
    echo $tableC;
    $tableD=strip_tags($_GET['tableD']);
    echo $tableD;
    $tableE=strip_tags($_GET['tableE']);
    echo $tableE;
    $tableF=strip_tags($_GET['tableF']);
    echo $tableF;

    //input this info into the SQL noise instrument table
    $request = mysql_query("INSERT INTO `noise` SET
        AUDIO = '$audio', 
        AUTOMATE = '$automate', 
        BY = '$by', 
        ENVELOPE = '$envelope', 
        LENGTH = '$length', 
        NAME ='$name', 
        NOTES = '$notes', 
        OUTPUT = '$output', 
        PATCH_NAME = '$patchname', 
        S_CMD = '$s_cmd', 
        SHAPE = '$shape', 
        TABLE = '$table', 
        table0 = '$table0', 
        table1 = '$table1', 
        table2 = '$table2', 
        table3 = '$table3', 
        table4 = '$table4',
        table5 = '$table5', 
        table6 = '$table6', 
        table7 = '$table7', 
        table8 = '$table8', 
        table9 = '$table9', 
        tableA = '$tableA', 
        tableB = '$tableB', 
        tableC = '$tableC', 
        tableD = '$tableD', 
        tableE = '$tableE',
        tableF = '$tableF',
        TYPE = '$type';" );
if($request) {
    echo "Your patch has been successfully uploaded.";
    echo "Thanks for contributing!";
}
else {
    echo "there has been a problem";
    }
}
?>

Когда я загружаю этот URL из моего приложения для iPhone:

NSString *website = [NSString stringWithFormat:@"http://mywebsite/problem.php?AUDIO=%@&AUTOMATE=%@&BY=%@&ENVELOPE=%@&LENGTH=%@&NAME=%@&NOTES=%@&OUTPUT=%@&PATCH_NAME=%@&S_CMD=%@&SHAPE=%@&TABLE=%@&table0=%@&table1=%@&table2=%@&table3=%@&table4=%@&table5=%@&table6=%@&table7=%@&table8=%@&table9=%@&tableA=%@&tableB=%@&tableC=%@&tableD=%@&tableE=%@&tableF=%@&TYPE=%@", audio, automate, by, envelope, length, name, notes, output, patch_name, s_cmd, shape, table, table0, table1, table2, table3, table4, table5, table6, table7, table8, table9, tableA, tableB, tableC, tableD, tableE, tableF, type];
    [BackgroundLoader loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:website]]];

Вывод, который я получаю:

AUDIOAUTOMATEBYENVELOPELENGTHNAMENOTESOUTPUTPATCH_NAMES_CMDSHAPETABLETABLE0...TABLEFthere has been a problem

Кто-нибудь может понять, почему этот код не обновляет таблицу?

Заранее спасибо.

Ответы [ 6 ]

4 голосов
/ 12 июня 2011

Вы можете использовать формат вставки для запросов MySQL

проблему можно найти, добавив ее после запроса

if (mysql_error()) {
   die (mysql_error());
}

, который выдаст вам сообщение об ошибке

в предположении я бы сказал, что точка с запятой в конце запроса вызовет проблему, это не требуется при вызове через php

также вы должны поставить галочки вокруг имен столбцов. вы, вероятно, обнаружите, что TYPE - зарезервированное слово, поэтому, как минимум, поставьте галочки около TYPE

также ваш скрипт открыт для инъекций SQL. попробуйте использовать $ value = mysql_real_escape_string ($ _ GET ['value']), чтобы остановить это

1 голос
/ 12 июня 2011

Кажется, у вас есть поля, названные как BY, TABLE, TYPE, которые являются зарезервированными словамиИспользуйте обратные кавычки для них:

`BY` = '$by',
...

`TABLE` = '$table',
...

`TYPE` = '$type' ;" );
1 голос
/ 12 июня 2011

Я никогда не видел INSERT ... SET используется.Вы можете попробовать более обычный синтаксис INSERT .. VALUES следующим образом:

INSERT INTO <table name> ( `FIELD1`, `FIELD2` )
VALUES ( VALUE1, VALUE2 )

Как подсказывает bumperbox - он, вероятно, не работает, потому что вы используете ключевое слово в качестве одного из имен ваших полей.Окружайте свои имена полей обратными чертами ( `), чтобы MySQL не интерпретировал их как ключевые слова.Например:

`TYPE` = ...
1 голос
/ 12 июня 2011

Вставка не используется с SET, следующие должны сделать

INSERT INTO `noise` VALUES(
    $value,
    ....
)

РЕДАКТИРОВАТЬ:
Если вам нужно указать имена полей, используйте следующее:

INSERT INTO `noise` 
(field1, field2, ....)
VALUES(
    $value1,
    $value2,
    ....
)
0 голосов
/ 16 февраля 2013

Я предлагаю отказаться от всего этого и использовать подготовленные заявления в сочетании с PDO. Ваш код в его нынешнем виде уязвим для атаки SQL-инъекцией.

0 голосов
/ 15 июня 2011

Проблема в том, что вы смешиваете числа со строками, и строки должны быть заключены в кавычки.У меня было много проблем с этим и вернулся к использованию синтаксиса значений.

...