2014-01-29 2 views
0

Я обхват через массив структур следующим образом:структура вставки элементы в базу данных

<cfloop array="#cfData#" index="i"> 
    <cfif structKeyExists(i, "date")> 
    <cfset counter++> 
    <cfoutput>#counter#</cfoutput> Date is: <cfoutput> #i.date#</cfoutput> <br/> 
    </cfif> 
</cfloop> 

Теперь я должен вставить значение даты и других ключей в мою базу данных, и я пытаюсь его как следующие :

<cfquery datasource="mydb" dbname="Stats"> 
    INSERT INTO mydatabase 
    VALUES 
     <cfif structKeyExists(cfData, "date")> 
      <cfset counter++>#cfData.date# 
     </cfif> 
     , 
     <cfif structKeyExists(cfData, "delivered")> 
      <cfset counter1++> 
      #cfData.delivered# 
     </cfif> 
     , 
     ... and so on for other key values... 
    </cfquery> 

Это правильный способ вставки его в базу данных MySQL?

PS: Вы также можете обратиться к моей предыдущей теме для получения дополнительной информации:

Checking for key existence in structure

UPDATE:

На самом деле, для того, чтобы избежать несоответствия columlist, я решил проверить его следующим образом

<cfset KeyList = "delivered, 
        unique_open, 
        spamreport, 
        drop, 
        request, 
        bounce, 
        deferred, 
        processed, 
        date, 
        startdate, 
        enddate, 
        open, 
        blocked"> 

<cfloop from="1" to="#arraylen#" index="i"> 

     <cfloop list="#KeyList#" index="colItem">  
     <cfif structKeyExists(cfData[i], "colItem")> 
     <cfoutput>#cfData[i].colItem#</cfoutput> 

     <cfelse> 
     NULL 
     </cfif> 
     <cfif colItem neq listLast(KeyList)>,</cfif> 
    </cfloop> 
    </cfloop> 

Показывает, что в браузере отображается NULL.

Однако, когда я проверить его как следующий, я получаю правильные результаты для delievered: 5 NULL 12 2 1 12 1

<cfloop from="1" to="#arraylen#" index="i"> 


     <cfif structKeyExists(cfData[i], "delivered")> 
     <cfoutput>#cfData[i].delivered#</cfoutput> 

     <cfelse> 
     NULL 
     </cfif> 


    </cfloop> 

Что случилось с использованием KeyList элементов?

+2

не на самом деле нет. похоже, вам нужно раскрасить синтаксис SQL для вставок. Кроме того, использование '' не просто передает эти значения непосредственно в запрос. –

+0

@SeanCoyne Что я не делаю в синтаксисе SQL Insert? Источник: Http: //dev.mysql.com/doc/refman/5.6/ru/insert.html Каким-то образом я буду проверять наличие ключей, и именно поэтому я сделал то, что я упомянул Я знаю , который я буду использовать в предложении WHERE. –

+0

@ user3239126 вам нужно иметь '()' вокруг ваших значений i.e. 'values ​​(1,2,3)' –

ответ

0

Это очень плохой способ вставки данных. Заявление на вставку sql выглядит так:

insert into mytable 
(field1, field2, etc) 
values 
(value1, value2, etc) 

и каждому указанному полю требуется соответствующее значение. Кроме того, для каждого значения требуется соответствующее поле.

Существует такая альтернатива:

insert into mytable 
values 
(value1, value2, etc) 

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

У вас есть условная логика в части значений вашего запроса. Если какой-либо из блоков cfif возвращает false, у вас есть хотя бы одна и, возможно, две проблемы. У вас определенно будет несоответствие между количеством полей и количеством значений. Возможно, у вас будет дополнительная запятая. Либо приведет к сбою вашего запроса.

Я думаю, вам нужен другой подход. cfquery имеет нулевой атрибут, который вы можете использовать в своей условной логике. Я позволю тебе подумать об этом некоторое время.

+0

Спасибо. Я знаю, как работает оператор Insert. Пожалуйста, обратитесь к моей недавней публикации, соответствующей рекомендациям Ли. Спасибо –

0

Этот ответ основан на массиве распорок, связанных в вопросе того, что данные вставляются

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

<!--- set your column names in a list ---> 
<cfset columnList = "date,delivered,open,processed,request,unique_open"> 

<cfquery datasource="mydb" dbname="Stats"> 
INSERT INTO mydatabase (#columnList#) 
VALUES 
    <!--- loop through your array ---> 
    <cfloop from="1" to="#arrayLen(cfData)#" index="i"> 
    (
    <!--- loop through the list of columns and see if they exists in the struct ---> 
    <cfloop list="#columnList#" index="colItem"> 
     <cfif structKeyExists(cfData[i], colItem)> 
     <cfqueryparam value="#cfData[i][colItem]#"> 
     <cfelse> 
     NULL 
     </cfif> 
     <cfif colItem neq listLast(columnList)>,</cfif> 
    </cfloop> 
    )<cfif i neq arrayLen(cfData)>,</cfif> 
    </cfloop> 
</cfquery> 

Кроме того, в этом формате я предложил бы использовать #createODBCDate()# перед установкой даты

+0

Я предлагаю переместить всю условную логику из строки sql. Это значительно облегчило бы подход «при сомнительном рассмотрении ваших данных» к устранению неполадок. Кроме того, атрибут называется null, а не isnull. –

+0

Спасибо Dan, что касается перемещения условной логики вне запроса, я не верю, что вы можете использовать теги вне , поэтому я оставил эту часть в одиночку. Тем не менее, я согласен, что это может сделать отладку немного сложнее. Кроме того, спасибо за исправление на «isNull» – ssteinbeck

+0

Вы не можете использовать cfqueryparams вне запроса, но вы можете установить переменные, которые будут использоваться в нулевых атрибутах. –

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