Что такое простое решение для динамического mysqli bind_param аргументы в PHP?

@Tomlak Мне удалось изменить ваш код и заставить его работать, большое спасибо за помощь, которую я не смог бы сделать без вашей помощи, и очень ценю вашу помощь и руководство, код, возможно, можно немного очистить, но Я не могу найти никаких недостатков в данных после нескольких дней тестирования. Я запустил его для файла объемом 3,6 ГБ, который произвел около 6,5 миллионов строк в таблице files_index и 7,4 миллиона строк в таблице product_ids, так что теперь у меня есть почти миллион потенциальных скусов, с которыми я потенциально могу сопоставить данные.

Я изменил его, чтобы он также добавил строку в таблицу product_ids, даже если нет дочернего узла M_Prod_ID с идентификатором продукта и Prod_ID, поэтому было проще создать представление, соответствующее данным. КОД НИЖЕ .......

> Blockquote$connectionString = "Data Source=Apps2\Apps2;Initial 
 Catalog=ICECATtesting;Integrated Security=SSPI"
$batchSize = 100000

 # set up [files_index] datatable & read schema from DB
$files_index_table = New-Object System.Data.DataTable;
$files_index_adapter = New-Object System.Data.SqlClient.SqlDataAdapter("SELECT * FROM 
files_index WHERE 0 = 1", $connectionString)
$files_index_adapter.Fill($files_index_table) | Out-Null;
$files_index_bcp = New-Object System.Data.SqlClient.SqlBulkCopy($connectionString)  
$files_index_bcp.DestinationTableName = "dbo.files_index"
$files_index_count = 0;

# set up [product_ids] datatable & read schema from DB
$product_ids_table = New-Object System.Data.DataTable
$product_ids_adapter = New-Object System.Data.SqlClient.SqlDataAdapter("SELECT * FROM 
product_ids WHERE 0 = 1", $connectionString)
$product_ids_adapter.Fill($product_ids_table) | Out-Null
$product_ids_bcp = New-Object System.Data.SqlClient.SqlBulkCopy($connectionString)
$product_ids_bcp.DestinationTableName = "dbo.product_ids"
$product_ids_count = 0

 # main import loop

$xmlReader = New-Object System.Xml.XmlTextReader("C:\Scripts\icecat\files.index.xml")
while ($xmlReader.Read()) {
# skip any XML nodes that aren't elements
if ($xmlReader.NodeType -ne [System.Xml.XmlNodeType]::Element) { continue }

# handle <file> elements
if ($xmlReader.Name -eq "file") {
    $files_index_count++

    # remember current product ID, we'll need it when we hit the next <M_Prod_ID> 
  element also add the Prod_ID from the file node
    $curr_product_id = $xmlReader.GetAttribute("Product_ID")
    $curr_prod_id = $xmlReader.GetAttribute("Prod_ID")
    $is_new_file = $false

    $newRow = $files_index_table.NewRow()
    $newRow["Product_ID"] = $xmlReader.GetAttribute("Product_ID")
    $newRow["path"] = $xmlReader.GetAttribute("path")
    $newRow["Updated"] = $xmlReader.GetAttribute("Updated")
    $newRow["Quality"] = $xmlReader.GetAttribute("Quality")
    $newRow["Supplier_id"] = $xmlReader.GetAttribute("Supplier_id")
    $newRow["Prod_ID"] = $xmlReader.GetAttribute("Prod_ID")
    $newRow["Catid"] = $xmlReader.GetAttribute("Catid")
    $newRow["On_Market"] = $xmlReader.GetAttribute("On_Market")
    $newRow["Model_Name"] = $xmlReader.GetAttribute("Model_Name")
    $newRow["Product_View"] = $xmlReader.GetAttribute("Product_View")
    $newRow["HighPic"] = $xmlReader.GetAttribute("HighPic")
    $newRow["HighPicSize"] = $xmlReader.GetAttribute("HighPicSize")
    $newRow["HighPicWidth"] = $xmlReader.GetAttribute("HighPicWidth")
    $newRow["HighPicHeight"] = $xmlReader.GetAttribute("HighPicHeight")
    $newRow["Date_Added"] = $xmlReader.GetAttribute("Date_Added")
    $Firstproduct_id = $xmlreader.GetAttribute("Product_ID")
    $Firstprod_id = $xmlreader.GetAttribute("Prod_ID")
    $newfilenode = $true

    $files_index_table.Rows.Add($newRow) | Out-Null
    $newRow = $product_ids_table.NewRow()
    $newRow["Product_ID"] = $curr_product_id  # from above
    $newRow["Alternative_ID"] = $curr_prod_id
    $product_ids_table.Rows.Add($newRow) | Out-Null


    if ($files_index_table.Rows.Count -eq $batchSize) {
        $files_index_bcp.WriteToServer($files_index_table)
        $files_index_table.Rows.Clear()
        Write-Host "$files_index_count <file> elements processed so far"

    }
    # handle <M_Prod_ID> elements
    } elseif ($xmlReader.Name -eq "M_Prod_ID") {
         $product_ids_count++

         # add self-reference row to the [product_ids] table also I added the Prod_ID 
from the file node so I can make a view to match all variants

    # only for the first <M_Prod_ID> per <file> we need to do this


        $xmlreader.read()
        $newRow = $product_ids_table.NewRow()
        $newRow["Product_ID"] = $curr_product_id  # from above
        $newRow["Alternative_ID"] = $xmlReader.Value
        $product_ids_table.Rows.Add($newRow) | Out-Null


    if ($product_ids_table.Rows.Count -eq $batchSize) {
        $product_ids_bcp.WriteToServer($product_ids_table)
        $product_ids_table.Rows.Clear()
        Write-Host "$product_ids_count <M_Prod_ID> elements processed so far"
    }
  }
 }

 # write any remaining rows to the server
if ($files_index_table.Rows.Count -gt 0) {
$files_index_bcp.WriteToServer($files_index_table)
$files_index_table.Rows.Clear()
}
Write-Host "$files_index_count <file> elements processed overall"

if ($product_ids_table.Rows.Count -gt 0) {
    $product_ids_bcp.WriteToServer($product_ids_table)
    $product_ids_table.Rows.Clear()
 }
 Write-Host "$product_ids_count <M_Prod_ID> elements processed overall"
7
задан GEOCHET 15 May 2009 в 16:39
поделиться

2 ответа

array($stmt, 'bindparams') 

- это способ PHP идентифицировать метод bind_params для объекта $ stmt , так как PHP 5 вы не используете больше не нужно использовать & впереди (а mysqli - это PHP 5, так что в старом посте это похоже на сбой).

вы можете увидеть похожий пример здесь

поэтому

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

в основном означает

$stmt->bind_params($array_of_params[0], $array_of_params[1] ... $array_of_params[N])
16
ответ дан 6 December 2019 в 10:03
поделиться

Разница между WaitForMultipleObjects () и портами завершения ввода / вывода заключается в том, что IOCP масштабируется до тысяч объектов, тогда как WFMO ( ) не может и не должен использоваться для чего-то большего, чем 64 объекта (даже если бы вы могли).

Вы не можете реально сравнить их по производительности, потому что в области <64 объектов они будут практически идентичны.

Однако WFMO () выполняет циклический перебор для своих объектов, поэтому занятые объекты с низкими индексными номерами могут истощать объекты с высокими индексными номерами. (Например, если объект 0 постоянно отключается, он будет голодать от объектов 1, 2, 3 и т. Д.). Это, очевидно, нежелательно.

Я написал библиотеку IOCP (для сокетов) для решения проблемы C10K и поместил ее в общественное достояние. Я смог на 512 Мб W2K-машине получить 4000 сокетов, одновременно передавая данные. Выражение $ userid == "ALL" будет вычислено как логическое значение, которое будет передано в bind_param . Мы не можем сказать bind_param , что параметр является логическим (строка формата понимает только строку, int, double и blob), поэтому bind_param преобразует логическое значение в int, что работает для нас.

Пока в базе данных нет ни user_id, ни location_id, все в порядке.

Пока в базе данных нет ни user_id, ни location_id, все в порядке.

Пока в базе данных нет ни user_id, ни location_id, все в порядке.

1
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: